This commit is contained in:
Ravi Reddy 2024-10-22 07:06:54 +00:00
commit 6f26d55846
141 changed files with 5612 additions and 1784 deletions

View File

@ -358,6 +358,11 @@ AC_DEFUN([TOOLCHAIN_EXTRACT_COMPILER_VERSION],
# Copyright (C) 2013 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# or look like
# gcc (GCC) 10.2.1 20200825 (Alibaba 10.2.1-3.8 2.32)
# Copyright (C) 2020 Free Software Foundation, Inc.
# This is free software; see the source for copying conditions. There is NO
# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
COMPILER_VERSION_OUTPUT=`$COMPILER --version 2>&1`
# Check that this is likely to be GCC.
$ECHO "$COMPILER_VERSION_OUTPUT" | $GREP "Free Software Foundation" > /dev/null
@ -371,7 +376,8 @@ AC_DEFUN([TOOLCHAIN_EXTRACT_COMPILER_VERSION],
COMPILER_VERSION_STRING=`$ECHO $COMPILER_VERSION_OUTPUT | \
$SED -e 's/ *Copyright .*//'`
COMPILER_VERSION_NUMBER=`$ECHO $COMPILER_VERSION_OUTPUT | \
$SED -e 's/^.* \(@<:@1-9@:>@<:@0-9@:>@*\.@<:@0-9.@:>@*\)@<:@^0-9.@:>@.*$/\1/'`
$AWK -F ')' '{print [$]2}' | \
$AWK '{print [$]1}'`
elif test "x$TOOLCHAIN_TYPE" = xclang; then
# clang --version output typically looks like
# Apple clang version 15.0.0 (clang-1500.3.9.4)

View File

@ -786,7 +786,10 @@ public class CLDRConverter {
String tzKey = Optional.ofNullable((String)handlerSupplMeta.get(tzid))
.orElse(tzid);
// Follow link, if needed
var tzLink = tzdbLinks.get(tzKey);
String tzLink = null;
for (var k = tzKey; tzdbLinks.containsKey(k);) {
k = tzLink = tzdbLinks.get(k);
}
if (tzLink == null && tzdbLinks.containsValue(tzKey)) {
// reverse link search
// this is needed as in tzdb, "America/Buenos_Aires" links to
@ -1214,7 +1217,7 @@ public class CLDRConverter {
private static Set<String> getAvailableZoneIds() {
assert handlerMetaZones != null;
if (AVAILABLE_TZIDS == null) {
AVAILABLE_TZIDS = new HashSet<>(ZoneId.getAvailableZoneIds());
AVAILABLE_TZIDS = new HashSet<>(Arrays.asList(TimeZone.getAvailableIDs()));
AVAILABLE_TZIDS.addAll(handlerMetaZones.keySet());
AVAILABLE_TZIDS.remove(MetaZonesParseHandler.NO_METAZONE_KEY);
}
@ -1372,6 +1375,7 @@ public class CLDRConverter {
private static void generateTZDBShortNamesMap() throws IOException {
Files.walk(Path.of(tzDataDir), 1, FileVisitOption.FOLLOW_LINKS)
.filter(p -> p.toFile().isFile())
.filter(p -> p.getFileName().toString().matches("africa|antarctica|asia|australasia|backward|etcetera|europe|northamerica|southamerica"))
.forEach(p -> {
try {
String zone = null;
@ -1394,43 +1398,41 @@ public class CLDRConverter {
}
// remove comments in-line
line = line.replaceAll("[ \t]*#.*", "");
var tokens = line.split("[ \t]+", -1);
var token0len = tokens.length > 0 ? tokens[0].length() : 0;
// Zone line
if (line.startsWith("Zone")) {
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Zone", 0, token0len)) {
if (zone != null) {
tzdbShortNamesMap.put(zone, format + NBSP + rule);
}
var zl = line.split("[ \t]+", -1);
zone = zl[1];
rule = zl[3];
format = flipIfNeeded(inVanguard, zl[4]);
zone = tokens[1];
rule = tokens[3];
format = flipIfNeeded(inVanguard, tokens[4]);
} else {
if (zone != null) {
if (line.startsWith("Rule") ||
line.startsWith("Link")) {
if (token0len > 0 &&
(tokens[0].regionMatches(true, 0, "Rule", 0, token0len) ||
tokens[0].regionMatches(true, 0, "Link", 0, token0len))) {
tzdbShortNamesMap.put(zone, format + NBSP + rule);
zone = null;
rule = null;
format = null;
} else {
var s = line.split("[ \t]+", -1);
rule = s[2];
format = flipIfNeeded(inVanguard, s[3]);
rule = tokens[2];
format = flipIfNeeded(inVanguard, tokens[3]);
}
}
}
// Rule line
if (line.startsWith("Rule")) {
var rl = line.split("[ \t]+", -1);
tzdbSubstLetters.put(rl[1] + NBSP + (rl[8].equals("0") ? STD : DST),
rl[9].replace(NO_SUBST, ""));
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Rule", 0, token0len)) {
tzdbSubstLetters.put(tokens[1] + NBSP + (tokens[8].equals("0") ? STD : DST),
tokens[9].replace(NO_SUBST, ""));
}
// Link line
if (line.startsWith("Link")) {
var ll = line.split("[ \t]+", -1);
tzdbLinks.put(ll[2], ll[1]);
if (token0len > 0 && tokens[0].regionMatches(true, 0, "Link", 0, token0len)) {
tzdbLinks.put(tokens[2], tokens[1]);
}
}
@ -1491,13 +1493,14 @@ public class CLDRConverter {
/*
* Convert TZDB offsets to JDK's offsets, eg, "-08" to "GMT-08:00".
* If it cannot recognize the pattern, return the argument as is.
* Returning null results in generating the GMT format at runtime.
*/
private static String convertGMTName(String f) {
try {
// Should pre-fill GMT format once COMPAT is gone.
// Till then, fall back to GMT format at runtime, after COMPAT short
// names are populated
ZoneOffset.of(f);
if (!f.equals("%z")) {
// Validate if the format is an offset
ZoneOffset.of(f);
}
return null;
} catch (DateTimeException dte) {
// textual representation. return as is

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2014, 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 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
@ -164,7 +164,8 @@ class TzdbZoneRulesProvider {
}
continue;
}
if (line.startsWith("Zone")) { // parse Zone line
int token0len = tokens.length > 0 ? tokens[0].length() : line.length();
if (line.regionMatches(true, 0, "Zone", 0, token0len)) { // parse Zone line
String name = tokens[1];
if (excludedZones.contains(name)){
continue;
@ -182,13 +183,13 @@ class TzdbZoneRulesProvider {
if (zLine.parse(tokens, 2)) {
openZone = null;
}
} else if (line.startsWith("Rule")) { // parse Rule line
} else if (line.regionMatches(true, 0, "Rule", 0, token0len)) { // parse Rule line
String name = tokens[1];
if (!rules.containsKey(name)) {
rules.put(name, new ArrayList<RuleLine>(10));
}
rules.get(name).add(new RuleLine().parse(tokens));
} else if (line.startsWith("Link")) { // parse link line
} else if (line.regionMatches(true, 0, "Link", 0, token0len)) { // parse link line
if (tokens.length >= 3) {
String realId = tokens[1];
String aliasId = tokens[2];
@ -304,7 +305,7 @@ class TzdbZoneRulesProvider {
month = parseMonth(tokens[off++]);
if (off < tokens.length) {
String dayRule = tokens[off++];
if (dayRule.startsWith("last")) {
if (dayRule.regionMatches(true, 0, "last", 0, 4)) {
dayOfMonth = -1;
dayOfWeek = parseDayOfWeek(dayRule.substring(4));
adjustForwards = false;
@ -355,42 +356,45 @@ class TzdbZoneRulesProvider {
}
int parseYear(String year, int defaultYear) {
switch (year.toLowerCase()) {
case "min": return 1900;
case "max": return Year.MAX_VALUE;
case "only": return defaultYear;
}
int len = year.length();
if (year.regionMatches(true, 0, "minimum", 0, len)) return 1900;
if (year.regionMatches(true, 0, "maximum", 0, len)) return Year.MAX_VALUE;
if (year.regionMatches(true, 0, "only", 0, len)) return defaultYear;
return Integer.parseInt(year);
}
Month parseMonth(String mon) {
switch (mon) {
case "Jan": return Month.JANUARY;
case "Feb": return Month.FEBRUARY;
case "Mar": return Month.MARCH;
case "Apr": return Month.APRIL;
case "May": return Month.MAY;
case "Jun": return Month.JUNE;
case "Jul": return Month.JULY;
case "Aug": return Month.AUGUST;
case "Sep": return Month.SEPTEMBER;
case "Oct": return Month.OCTOBER;
case "Nov": return Month.NOVEMBER;
case "Dec": return Month.DECEMBER;
}
int len = mon.length();
if (mon.regionMatches(true, 0, "January", 0, len)) return Month.JANUARY;
if (mon.regionMatches(true, 0, "February", 0, len)) return Month.FEBRUARY;
if (mon.regionMatches(true, 0, "March", 0, len)) return Month.MARCH;
if (mon.regionMatches(true, 0, "April", 0, len)) return Month.APRIL;
if (mon.regionMatches(true, 0, "May", 0, len)) return Month.MAY;
if (mon.regionMatches(true, 0, "June", 0, len)) return Month.JUNE;
if (mon.regionMatches(true, 0, "July", 0, len)) return Month.JULY;
if (mon.regionMatches(true, 0, "August", 0, len)) return Month.AUGUST;
if (mon.regionMatches(true, 0, "September", 0, len)) return Month.SEPTEMBER;
if (mon.regionMatches(true, 0, "October", 0, len)) return Month.OCTOBER;
if (mon.regionMatches(true, 0, "November", 0, len)) return Month.NOVEMBER;
if (mon.regionMatches(true, 0, "December", 0, len)) return Month.DECEMBER;
throw new IllegalArgumentException("Unknown month: " + mon);
}
DayOfWeek parseDayOfWeek(String dow) {
switch (dow) {
case "Mon": return DayOfWeek.MONDAY;
case "Tue": return DayOfWeek.TUESDAY;
case "Wed": return DayOfWeek.WEDNESDAY;
case "Thu": return DayOfWeek.THURSDAY;
case "Fri": return DayOfWeek.FRIDAY;
case "Sat": return DayOfWeek.SATURDAY;
case "Sun": return DayOfWeek.SUNDAY;
}
int len = dow.length();
if (dow.regionMatches(true, 0, "Monday", 0, len)) return DayOfWeek.MONDAY;
if (dow.regionMatches(true, 0, "Tuesday", 0, len)) return DayOfWeek.TUESDAY;
if (dow.regionMatches(true, 0, "Wednesday", 0, len)) return DayOfWeek.WEDNESDAY;
if (dow.regionMatches(true, 0, "Thursday", 0, len)) return DayOfWeek.THURSDAY;
if (dow.regionMatches(true, 0, "Friday", 0, len)) return DayOfWeek.FRIDAY;
if (dow.regionMatches(true, 0, "Saturday", 0, len)) return DayOfWeek.SATURDAY;
if (dow.regionMatches(true, 0, "Sunday", 0, len)) return DayOfWeek.SUNDAY;
throw new IllegalArgumentException("Unknown day-of-week: " + dow);
}

View File

@ -114,6 +114,8 @@ ifeq ($(call isTargetOs, linux), true)
# stripping during the test libraries' build.
BUILD_JDK_JTREG_LIBRARIES_CFLAGS_libFib := -g
BUILD_JDK_JTREG_LIBRARIES_STRIP_SYMBOLS_libFib := false
# nio tests' libCreationTimeHelper native needs -ldl linker flag
BUILD_JDK_JTREG_LIBRARIES_LDFLAGS_libCreationTimeHelper := -ldl
endif
ifeq ($(ASAN_ENABLED), true)

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
@ -27,6 +27,7 @@
#include "asm/macroAssembler.hpp"
#include "classfile/javaClasses.inline.hpp"
#include "classfile/vmClasses.hpp"
#include "compiler/disassembler.hpp"
#include "interpreter/interpreter.hpp"
#include "interpreter/interpreterRuntime.hpp"
#include "memory/allocation.inline.hpp"
@ -36,7 +37,7 @@
#include "runtime/frame.inline.hpp"
#include "runtime/stubRoutines.hpp"
#define __ _masm->
#define __ Disassembler::hook<MacroAssembler>(__FILE__, __LINE__, _masm)->
#ifdef PRODUCT
#define BLOCK_COMMENT(str) /* nothing */

View File

@ -26,6 +26,7 @@
#include "precompiled.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "classfile/javaClasses.hpp"
#include "compiler/disassembler.hpp"
#include "compiler/compiler_globals.hpp"
#include "gc/shared/barrierSetAssembler.hpp"
#include "interpreter/bytecodeHistogram.hpp"
@ -67,7 +68,7 @@
// Max size with JVMTI
int TemplateInterpreter::InterpreterCodeSize = 200 * 1024;
#define __ _masm->
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
//-----------------------------------------------------------------------------
@ -2011,13 +2012,21 @@ void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t,
address& vep) {
assert(t->is_valid() && t->tos_in() == vtos, "illegal template");
Label L;
aep = __ pc(); __ push_ptr(); __ b(L);
fep = __ pc(); __ push_f(); __ b(L);
dep = __ pc(); __ push_d(); __ b(L);
lep = __ pc(); __ push_l(); __ b(L);
bep = cep = sep =
iep = __ pc(); __ push_i();
vep = __ pc();
aep = __ pc(); // atos entry point
__ push_ptr();
__ b(L);
fep = __ pc(); // ftos entry point
__ push_f();
__ b(L);
dep = __ pc(); // dtos entry point
__ push_d();
__ b(L);
lep = __ pc(); // ltos entry point
__ push_l();
__ b(L);
bep = cep = sep = iep = __ pc(); // [bcsi]tos entry point
__ push_i();
vep = __ pc(); // vtos entry point
__ bind(L);
generate_and_dispatch(t);
}

View File

@ -25,6 +25,7 @@
#include "precompiled.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "compiler/disassembler.hpp"
#include "compiler/compilerDefinitions.inline.hpp"
#include "gc/shared/barrierSetAssembler.hpp"
#include "gc/shared/collectedHeap.hpp"
@ -49,7 +50,7 @@
#include "runtime/synchronizer.hpp"
#include "utilities/powerOfTwo.hpp"
#define __ _masm->
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
// Address computation: local variables

View File

@ -117,9 +117,9 @@ bool frame::safe_for_sender(JavaThread *thread) {
return false;
}
common_abi* sender_abi = (common_abi*) fp;
volatile common_abi* sender_abi = (common_abi*) fp; // May get updated concurrently by deoptimization!
intptr_t* sender_sp = (intptr_t*) fp;
address sender_pc = (address) sender_abi->lr;;
address sender_pc = (address) sender_abi->lr;
if (Continuation::is_return_barrier_entry(sender_pc)) {
// If our sender_pc is the return barrier, then our "real" sender is the continuation entry
@ -134,9 +134,18 @@ bool frame::safe_for_sender(JavaThread *thread) {
return false;
}
intptr_t* unextended_sender_sp = is_interpreted_frame() ? interpreter_frame_sender_sp() : sender_sp;
// If the sender is a deoptimized nmethod we need to check if the original pc is valid.
nmethod* sender_nm = sender_blob->as_nmethod_or_null();
if (sender_nm != nullptr && sender_nm->is_deopt_pc(sender_pc)) {
address orig_pc = *(address*)((address)unextended_sender_sp + sender_nm->orig_pc_offset());
if (!sender_nm->insts_contains_inclusive(orig_pc)) return false;
}
// It should be safe to construct the sender though it might not be valid.
frame sender(sender_sp, sender_pc, nullptr /* unextended_sp */, nullptr /* fp */, sender_blob);
frame sender(sender_sp, sender_pc, unextended_sender_sp, nullptr /* fp */, sender_blob);
// Do we have a valid fp?
address sender_fp = (address) sender.fp();

View File

@ -52,11 +52,11 @@ static void x_load_barrier_slow_path(MacroAssembler* masm, const MachNode* node,
%}
// Load Pointer
instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp, rFlagsReg cr)
%{
match(Set dst (LoadP mem));
predicate(UseZGC && !ZGenerational && (n->as_Load()->barrier_data() != 0));
effect(TEMP dst, TEMP tmp);
effect(TEMP dst, TEMP tmp, KILL cr);
ins_cost(4 * DEFAULT_COST);
@ -71,11 +71,11 @@ instruct xLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
ins_pipe(iload_reg_mem);
%}
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
effect(TEMP_DEF res, TEMP tmp);
effect(TEMP_DEF res, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -105,11 +105,11 @@ instruct xCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
ins_pipe(pipe_slow);
%}
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() == XLoadBarrierStrong));
effect(TEMP_DEF res, TEMP tmp);
effect(TEMP_DEF res, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -139,10 +139,10 @@ instruct xCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
ins_pipe(pipe_slow);
%}
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
effect(TEMP_DEF res, TEMP tmp);
effect(TEMP_DEF res, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -167,10 +167,10 @@ instruct xCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
ins_pipe(pipe_slow);
%}
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp) %{
instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() == XLoadBarrierStrong);
effect(TEMP_DEF res, TEMP tmp);
effect(TEMP_DEF res, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -195,10 +195,10 @@ instruct xCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
ins_pipe(pipe_slow);
%}
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set prev (GetAndSetP mem newv));
predicate(UseZGC && !ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP_DEF prev, TEMP tmp);
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -212,10 +212,10 @@ instruct xGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
ins_pipe(pipe_serial);
%}
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
instruct xGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set prev (GetAndSetP mem newv));
predicate(UseZGC && !ZGenerational && needs_acquiring_load_reserved(n) && (n->as_LoadStore()->barrier_data() != 0));
effect(TEMP_DEF prev, TEMP tmp);
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
ins_cost(VOLATILE_REF_COST);

View File

@ -90,11 +90,11 @@ static void z_store_barrier(MacroAssembler* masm, const MachNode* node, Address
%}
// Load Pointer
instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp, rFlagsReg cr)
%{
match(Set dst (LoadP mem));
predicate(UseZGC && ZGenerational && n->as_Load()->barrier_data() != 0);
effect(TEMP dst, TEMP tmp);
effect(TEMP dst, TEMP tmp, KILL cr);
ins_cost(4 * DEFAULT_COST);
@ -110,11 +110,11 @@ instruct zLoadP(iRegPNoSp dst, memory mem, iRegPNoSp tmp)
%}
// Store Pointer
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2)
instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2, rFlagsReg cr)
%{
predicate(UseZGC && ZGenerational && n->as_Store()->barrier_data() != 0);
match(Set mem (StoreP mem src));
effect(TEMP tmp1, TEMP tmp2);
effect(TEMP tmp1, TEMP tmp2, KILL cr);
ins_cost(125); // XXX
format %{ "sd $mem, $src\t# ptr" %}
@ -127,11 +127,11 @@ instruct zStoreP(memory mem, iRegP src, iRegPNoSp tmp1, iRegPNoSp tmp2)
%}
instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -150,11 +150,11 @@ instruct zCompareAndSwapP(iRegINoSp res, indirect mem, iRegP oldval, iRegP newva
%}
instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP newval,
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
match(Set res (CompareAndSwapP mem (Binary oldval newval)));
match(Set res (WeakCompareAndSwapP mem (Binary oldval newval)));
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -173,10 +173,10 @@ instruct zCompareAndSwapPAcq(iRegINoSp res, indirect mem, iRegP oldval, iRegP ne
%}
instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -195,10 +195,10 @@ instruct zCompareAndExchangeP(iRegPNoSp res, indirect mem, iRegP oldval, iRegP n
%}
instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iRegP newval,
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1) %{
iRegPNoSp oldval_tmp, iRegPNoSp newval_tmp, iRegPNoSp tmp1, rFlagsReg cr) %{
match(Set res (CompareAndExchangeP mem (Binary oldval newval)));
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res);
effect(TEMP oldval_tmp, TEMP newval_tmp, TEMP tmp1, TEMP_DEF res, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -216,10 +216,10 @@ instruct zCompareAndExchangePAcq(iRegPNoSp res, indirect mem, iRegP oldval, iReg
ins_pipe(pipe_slow);
%}
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set prev (GetAndSetP mem newv));
predicate(UseZGC && ZGenerational && !needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP_DEF prev, TEMP tmp);
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);
@ -234,10 +234,10 @@ instruct zGetAndSetP(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
ins_pipe(pipe_serial);
%}
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp) %{
instruct zGetAndSetPAcq(indirect mem, iRegP newv, iRegPNoSp prev, iRegPNoSp tmp, rFlagsReg cr) %{
match(Set prev (GetAndSetP mem newv));
predicate(UseZGC && ZGenerational && needs_acquiring_load_reserved(n) && n->as_LoadStore()->barrier_data() != 0);
effect(TEMP_DEF prev, TEMP tmp);
effect(TEMP_DEF prev, TEMP tmp, KILL cr);
ins_cost(2 * VOLATILE_REF_COST);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 1997, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 1997, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, Red Hat Inc. All rights reserved.
* Copyright (c) 2020, 2023, Huawei Technologies Co., Ltd. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@ -28,6 +28,7 @@
#include "asm/macroAssembler.hpp"
#include "classfile/javaClasses.inline.hpp"
#include "classfile/vmClasses.hpp"
#include "compiler/disassembler.hpp"
#include "interpreter/interpreter.hpp"
#include "interpreter/interpreterRuntime.hpp"
#include "memory/allocation.inline.hpp"
@ -37,7 +38,7 @@
#include "runtime/frame.inline.hpp"
#include "runtime/stubRoutines.hpp"
#define __ _masm->
#define __ Disassembler::hook<MacroAssembler>(__FILE__, __LINE__, _masm)->
#ifdef PRODUCT
#define BLOCK_COMMENT(str) /* nothing */

View File

@ -4801,11 +4801,10 @@ instruct gather_loadS(vReg dst, indirect mem, vReg idx) %{
effect(TEMP_DEF dst);
format %{ "gather_loadS $dst, $mem, $idx" %}
ins_encode %{
__ vmv1r_v(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg));
BasicType bt = Matcher::vector_element_basic_type(this);
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
__ vsetvli_helper(bt, Matcher::vector_length(this));
__ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg), (int)sew);
__ vsll_vi(as_VectorRegister($dst$$reg), as_VectorRegister($idx$$reg), (int)sew);
__ vluxei32_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
as_VectorRegister($dst$$reg));
%}
@ -4835,11 +4834,10 @@ instruct gather_loadS_masked(vReg dst, indirect mem, vReg idx, vRegMask_V0 v0, v
effect(TEMP_DEF dst, TEMP tmp);
format %{ "gather_loadS_masked $dst, $mem, $idx, $v0\t# KILL $tmp" %}
ins_encode %{
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
BasicType bt = Matcher::vector_element_basic_type(this);
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
__ vsetvli_helper(bt, Matcher::vector_length(this));
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
__ vxor_vv(as_VectorRegister($dst$$reg), as_VectorRegister($dst$$reg),
as_VectorRegister($dst$$reg));
__ vluxei32_v(as_VectorRegister($dst$$reg), as_Register($mem$$base),
@ -4875,11 +4873,10 @@ instruct scatter_storeS(indirect mem, vReg src, vReg idx, vReg tmp) %{
effect(TEMP tmp);
format %{ "scatter_storeS $mem, $idx, $src\t# KILL $tmp" %}
ins_encode %{
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
BasicType bt = Matcher::vector_element_basic_type(this, $src);
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
__ vsuxei32_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
as_VectorRegister($tmp$$reg));
%}
@ -4909,11 +4906,10 @@ instruct scatter_storeS_masked(indirect mem, vReg src, vReg idx, vRegMask_V0 v0,
effect(TEMP tmp);
format %{ "scatter_storeS_masked $mem, $idx, $src, $v0\t# KILL $tmp" %}
ins_encode %{
__ vmv1r_v(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg));
BasicType bt = Matcher::vector_element_basic_type(this, $src);
Assembler::SEW sew = Assembler::elemtype_to_sew(bt);
__ vsetvli_helper(bt, Matcher::vector_length(this, $src));
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($tmp$$reg), (int)sew);
__ vsll_vi(as_VectorRegister($tmp$$reg), as_VectorRegister($idx$$reg), (int)sew);
__ vsuxei32_v(as_VectorRegister($src$$reg), as_Register($mem$$base),
as_VectorRegister($tmp$$reg), Assembler::v0_t);
%}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2014, 2020, Red Hat Inc. All rights reserved.
* Copyright (c) 2020, 2022, Huawei Technologies Co., Ltd. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
@ -27,6 +27,7 @@
#include "precompiled.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "classfile/javaClasses.hpp"
#include "compiler/disassembler.hpp"
#include "gc/shared/barrierSetAssembler.hpp"
#include "interpreter/bytecodeHistogram.hpp"
#include "interpreter/bytecodeTracer.hpp"
@ -70,7 +71,7 @@
// Max size with JVMTI
int TemplateInterpreter::InterpreterCodeSize = 256 * 1024;
#define __ _masm->
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
//-----------------------------------------------------------------------------
@ -1748,13 +1749,21 @@ void TemplateInterpreterGenerator::set_vtos_entry_points(Template* t,
address& vep) {
assert(t != nullptr && t->is_valid() && t->tos_in() == vtos, "illegal template");
Label L;
aep = __ pc(); __ push_ptr(); __ j(L);
fep = __ pc(); __ push_f(); __ j(L);
dep = __ pc(); __ push_d(); __ j(L);
lep = __ pc(); __ push_l(); __ j(L);
bep = cep = sep =
iep = __ pc(); __ push_i();
vep = __ pc();
aep = __ pc(); // atos entry point
__ push_ptr();
__ j(L);
fep = __ pc(); // ftos entry point
__ push_f();
__ j(L);
dep = __ pc(); // dtos entry point
__ push_d();
__ j(L);
lep = __ pc(); // ltos entry point
__ push_l();
__ j(L);
bep = cep = sep = iep = __ pc(); // [bcsi]tos entry point
__ push_i();
vep = __ pc(); // vtos entry point
__ bind(L);
generate_and_dispatch(t);
}

View File

@ -26,6 +26,7 @@
#include "precompiled.hpp"
#include "asm/macroAssembler.inline.hpp"
#include "compiler/disassembler.hpp"
#include "gc/shared/barrierSetAssembler.hpp"
#include "gc/shared/collectedHeap.hpp"
#include "gc/shared/tlab_globals.hpp"
@ -49,7 +50,7 @@
#include "runtime/synchronizer.hpp"
#include "utilities/powerOfTwo.hpp"
#define __ _masm->
#define __ Disassembler::hook<InterpreterMacroAssembler>(__FILE__, __LINE__, _masm)->
// Address computation: local variables
@ -178,7 +179,6 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
__ la(temp_reg, Address(temp_reg, in_bytes(ResolvedFieldEntry::put_code_offset())));
}
// Load-acquire the bytecode to match store-release in ResolvedFieldEntry::fill_in()
__ membar(MacroAssembler::AnyAny);
__ lbu(temp_reg, Address(temp_reg, 0));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
__ mv(bc_reg, bc);
@ -320,7 +320,6 @@ void TemplateTable::ldc(LdcType type) {
// get type
__ addi(x13, x11, tags_offset);
__ add(x13, x10, x13);
__ membar(MacroAssembler::AnyAny);
__ lbu(x13, Address(x13, 0));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
@ -2189,7 +2188,6 @@ void TemplateTable::resolve_cache_and_index_for_method(int byte_no,
break;
}
// Load-acquire the bytecode to match store-release in InterpreterRuntime
__ membar(MacroAssembler::AnyAny);
__ lbu(temp, Address(temp, 0));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
@ -2241,7 +2239,6 @@ void TemplateTable::resolve_cache_and_index_for_field(int byte_no,
__ la(temp, Address(Rcache, in_bytes(ResolvedFieldEntry::put_code_offset())));
}
// Load-acquire the bytecode to match store-release in ResolvedFieldEntry::fill_in()
__ membar(MacroAssembler::AnyAny);
__ lbu(temp, Address(temp, 0));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
__ mv(t0, (int) code); // have we resolved this bytecode?
@ -2403,7 +2400,6 @@ void TemplateTable::load_invokedynamic_entry(Register method) {
Label resolved;
__ load_resolved_indy_entry(cache, index);
__ membar(MacroAssembler::AnyAny);
__ ld(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
@ -2418,7 +2414,6 @@ void TemplateTable::load_invokedynamic_entry(Register method) {
__ call_VM(noreg, entry, method);
// Update registers with resolved info
__ load_resolved_indy_entry(cache, index);
__ membar(MacroAssembler::AnyAny);
__ ld(method, Address(cache, in_bytes(ResolvedIndyEntry::method_offset())));
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
@ -3533,7 +3528,6 @@ void TemplateTable::_new() {
const int tags_offset = Array<u1>::base_offset_in_bytes();
__ add(t0, x10, x13);
__ la(t0, Address(t0, tags_offset));
__ membar(MacroAssembler::AnyAny);
__ lbu(t0, t0);
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
__ sub(t1, t0, (u1)JVM_CONSTANT_Class);
@ -3652,7 +3646,6 @@ void TemplateTable::checkcast() {
// See if bytecode has already been quicked
__ add(t0, x13, Array<u1>::base_offset_in_bytes());
__ add(x11, t0, x9);
__ membar(MacroAssembler::AnyAny);
__ lbu(x11, x11);
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
__ sub(t0, x11, (u1)JVM_CONSTANT_Class);
@ -3708,7 +3701,6 @@ void TemplateTable::instanceof() {
// See if bytecode has already been quicked
__ add(t0, x13, Array<u1>::base_offset_in_bytes());
__ add(x11, t0, x9);
__ membar(MacroAssembler::AnyAny);
__ lbu(x11, x11);
__ membar(MacroAssembler::LoadLoad | MacroAssembler::LoadStore);
__ sub(t0, x11, (u1)JVM_CONSTANT_Class);

View File

@ -1568,7 +1568,7 @@ void GraphBuilder::method_return(Value x, bool ignore_return) {
// The conditions for a memory barrier are described in Parse::do_exits().
bool need_mem_bar = false;
if (method()->name() == ciSymbols::object_initializer_name() &&
(scope()->wrote_final() ||
(scope()->wrote_final() || scope()->wrote_stable() ||
(AlwaysSafeConstructors && scope()->wrote_fields()) ||
(support_IRIW_for_not_multiple_copy_atomic_cpu && scope()->wrote_volatile()))) {
need_mem_bar = true;
@ -1746,15 +1746,17 @@ void GraphBuilder::access_field(Bytecodes::Code code) {
}
}
if (field->is_final() && (code == Bytecodes::_putfield)) {
scope()->set_wrote_final();
}
if (code == Bytecodes::_putfield) {
scope()->set_wrote_fields();
if (field->is_volatile()) {
scope()->set_wrote_volatile();
}
if (field->is_final()) {
scope()->set_wrote_final();
}
if (field->is_stable()) {
scope()->set_wrote_stable();
}
}
const int offset = !needs_patching ? field->offset_in_bytes() : -1;

View File

@ -146,6 +146,7 @@ IRScope::IRScope(Compilation* compilation, IRScope* caller, int caller_bci, ciMe
_wrote_final = false;
_wrote_fields = false;
_wrote_volatile = false;
_wrote_stable = false;
_start = nullptr;
if (osr_bci != -1) {

View File

@ -149,6 +149,7 @@ class IRScope: public CompilationResourceObj {
bool _wrote_final; // has written final field
bool _wrote_fields; // has written fields
bool _wrote_volatile; // has written volatile field
bool _wrote_stable; // has written @Stable field
BlockBegin* _start; // the start block, successsors are method entries
ResourceBitMap _requires_phi_function; // bit is set if phi functions at loop headers are necessary for a local variable
@ -187,6 +188,8 @@ class IRScope: public CompilationResourceObj {
bool wrote_fields () const { return _wrote_fields; }
void set_wrote_volatile() { _wrote_volatile = true; }
bool wrote_volatile () const { return _wrote_volatile; }
void set_wrote_stable() { _wrote_stable = true; }
bool wrote_stable() const { return _wrote_stable; }
};

View File

@ -1672,7 +1672,10 @@ void ciEnv::dump_replay_data_helper(outputStream* out) {
for (int i = 0; i < objects->length(); i++) {
objects->at(i)->dump_replay_data(out);
}
dump_compile_data(out);
if (this->task() != nullptr) {
dump_compile_data(out);
}
out->flush();
}

View File

@ -1434,19 +1434,12 @@ void java_lang_Class::compute_offsets() {
InstanceKlass* k = vmClasses::Class_klass();
CLASS_FIELDS_DO(FIELD_COMPUTE_OFFSET);
// Init lock is a C union with component_mirror. Only instanceKlass mirrors have
// init_lock and only ArrayKlass mirrors have component_mirror. Since both are oops
// GC treats them the same.
_init_lock_offset = _component_mirror_offset;
CLASS_INJECTED_FIELDS(INJECTED_FIELD_COMPUTE_OFFSET);
}
#if INCLUDE_CDS
void java_lang_Class::serialize_offsets(SerializeClosure* f) {
f->do_bool(&_offsets_computed);
f->do_u4((u4*)&_init_lock_offset);
CLASS_FIELDS_DO(FIELD_SERIALIZE_OFFSET);

View File

@ -210,6 +210,7 @@ class java_lang_String : AllStatic {
macro(java_lang_Class, protection_domain, object_signature, false) \
macro(java_lang_Class, signers, object_signature, false) \
macro(java_lang_Class, source_file, object_signature, false) \
macro(java_lang_Class, init_lock, object_signature, false)
class java_lang_Class : AllStatic {
friend class VMStructs;

View File

@ -897,7 +897,7 @@ void Dependencies::DepStream::print_dependency(outputStream* st, Klass* witness,
void Dependencies::DepStream::initial_asserts(size_t byte_limit) {
assert(must_be_in_vm(), "raw oops here");
_byte_limit = byte_limit;
_type = (DepType)(end_marker-1); // defeat "already at end" assert
_type = undefined_dependency; // defeat "already at end" assert
assert((_code!=nullptr) + (_deps!=nullptr) == 1, "one or t'other");
}
#endif //ASSERT

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
* 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
@ -103,6 +103,9 @@ class Dependencies: public ResourceObj {
// type now includes N, that is, all super types of N.
//
enum DepType {
// _type is initially set to -1, to prevent "already at end" assert
undefined_dependency = -1,
end_marker = 0,
// An 'evol' dependency simply notes that the contents of the

View File

@ -153,10 +153,7 @@ bool ShenandoahConcurrentGC::collect(GCCause::Cause cause) {
// the space. This would be the last action if there is nothing to evacuate.
entry_cleanup_early();
{
ShenandoahHeapLocker locker(heap->lock());
heap->free_set()->log_status();
}
heap->free_set()->log_status_under_lock();
// Perform concurrent class unloading
if (heap->unload_classes() &&
@ -924,8 +921,11 @@ void ShenandoahConcurrentGC::op_init_updaterefs() {
heap->set_evacuation_in_progress(false);
heap->set_concurrent_weak_root_in_progress(false);
heap->prepare_update_heap_references(true /*concurrent*/);
heap->set_update_refs_in_progress(true);
if (ShenandoahVerify) {
heap->verifier()->verify_before_updaterefs();
}
heap->set_update_refs_in_progress(true);
if (ShenandoahPacing) {
heap->pacer()->setup_for_updaterefs();
}

View File

@ -147,10 +147,7 @@ void ShenandoahControlThread::run_service() {
heap->set_forced_counters_update(true);
// If GC was requested, we better dump freeset data for performance debugging
{
ShenandoahHeapLocker locker(heap->lock());
heap->free_set()->log_status();
}
heap->free_set()->log_status_under_lock();
switch (mode) {
case concurrent_normal:
@ -178,19 +175,19 @@ void ShenandoahControlThread::run_service() {
// Report current free set state at the end of cycle, whether
// it is a normal completion, or the abort.
{
ShenandoahHeapLocker locker(heap->lock());
heap->free_set()->log_status();
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
// usage goes down.
ShenandoahHeapLocker locker(heap->lock());
heap->update_capacity_and_used_at_gc();
// Signal that we have completed a visit to all live objects.
heap->record_whole_heap_examined_timestamp();
}
// Signal that we have completed a visit to all live objects.
heap->record_whole_heap_examined_timestamp();
// Disable forced counters update, and update counters one more time
// to capture the state at the end of GC session.
heap->handle_force_counters_update();

View File

@ -1130,6 +1130,16 @@ void ShenandoahFreeSet::reserve_regions(size_t to_reserve) {
}
}
void ShenandoahFreeSet::log_status_under_lock() {
// Must not be heap locked, it acquires heap lock only when log is enabled
shenandoah_assert_not_heaplocked();
if (LogTarget(Info, gc, free)::is_enabled()
DEBUG_ONLY(|| LogTarget(Debug, gc, free)::is_enabled())) {
ShenandoahHeapLocker locker(_heap->lock());
log_status();
}
}
void ShenandoahFreeSet::log_status() {
shenandoah_assert_heaplocked();
@ -1329,7 +1339,6 @@ void ShenandoahFreeSet::print_on(outputStream* out) const {
double ShenandoahFreeSet::internal_fragmentation() {
double squared = 0;
double linear = 0;
int count = 0;
idx_t rightmost = _partitions.rightmost(ShenandoahFreeSetPartitionId::Mutator);
for (idx_t index = _partitions.leftmost(ShenandoahFreeSetPartitionId::Mutator); index <= rightmost; ) {
@ -1339,11 +1348,10 @@ double ShenandoahFreeSet::internal_fragmentation() {
size_t used = r->used();
squared += used * used;
linear += used;
count++;
index = _partitions.find_index_of_next_available_region(ShenandoahFreeSetPartitionId::Mutator, index + 1);
}
if (count > 0) {
if (linear > 0) {
double s = squared / (ShenandoahHeapRegion::region_size_bytes() * linear);
return 1 - s;
} else {

View File

@ -318,6 +318,9 @@ private:
void finish_rebuild(size_t cset_regions);
// log status, assuming lock has already been acquired by the caller.
void log_status();
public:
ShenandoahFreeSet(ShenandoahHeap* heap, size_t max_regions);
@ -340,7 +343,8 @@ public:
void move_regions_from_collector_to_mutator(size_t cset_regions);
void recycle_trash();
void log_status();
// Acquire heap lock and log status, assuming heap lock is not acquired by the caller.
void log_status_under_lock();
inline size_t capacity() const { return _partitions.capacity_of(ShenandoahFreeSetPartitionId::Mutator); }
inline size_t used() const { return _partitions.used_by(ShenandoahFreeSetPartitionId::Mutator); }

View File

@ -23,7 +23,7 @@
*/
#include "precompiled.hpp"
#include "gc/shenandoah/shenandoahSimpleBitMap.hpp"
#include "gc/shenandoah/shenandoahSimpleBitMap.inline.hpp"
ShenandoahSimpleBitMap::ShenandoahSimpleBitMap(size_t num_bits) :
_num_bits(num_bits),
@ -43,8 +43,8 @@ size_t ShenandoahSimpleBitMap::count_leading_ones(idx_t start_idx) const {
assert((start_idx >= 0) && (start_idx < _num_bits), "precondition");
size_t array_idx = start_idx >> LogBitsPerWord;
uintx element_bits = _bitmap[array_idx];
uintx bit_number = start_idx & right_n_bits(LogBitsPerWord);
uintx mask = ~right_n_bits(bit_number);
uintx bit_number = start_idx & (BitsPerWord - 1);
uintx mask = ~tail_mask(bit_number);
size_t counted_ones = 0;
while ((element_bits & mask) == mask) {
// All bits numbered >= bit_number are set
@ -54,7 +54,7 @@ size_t ShenandoahSimpleBitMap::count_leading_ones(idx_t start_idx) const {
// Strength reduction: array_idx = (start_idx >> LogBitsPerWord)
array_idx++;
element_bits = _bitmap[array_idx];
// Constant folding: bit_number = start_idx & right_n_bits(LogBitsPerWord);
// Constant folding: bit_number = start_idx & (BitsPerWord - 1);
bit_number = 0;
// Constant folding: mask = ~right_n_bits(bit_number);
mask = ~0;
@ -70,9 +70,9 @@ size_t ShenandoahSimpleBitMap::count_trailing_ones(idx_t last_idx) const {
assert((last_idx >= 0) && (last_idx < _num_bits), "precondition");
size_t array_idx = last_idx >> LogBitsPerWord;
uintx element_bits = _bitmap[array_idx];
uintx bit_number = last_idx & right_n_bits(LogBitsPerWord);
uintx bit_number = last_idx & (BitsPerWord - 1);
// All ones from bit 0 to the_bit
uintx mask = right_n_bits(bit_number + 1);
uintx mask = tail_mask(bit_number + 1);
size_t counted_ones = 0;
while ((element_bits & mask) == mask) {
// All bits numbered <= bit_number are set
@ -81,7 +81,7 @@ size_t ShenandoahSimpleBitMap::count_trailing_ones(idx_t last_idx) const {
// Dead code: do not need to compute: last_idx -= found_ones;
array_idx--;
element_bits = _bitmap[array_idx];
// Constant folding: bit_number = last_idx & right_n_bits(LogBitsPerWord);
// Constant folding: bit_number = last_idx & (BitsPerWord - 1);
bit_number = BitsPerWord - 1;
// Constant folding: mask = right_n_bits(bit_number + 1);
mask = ~0;
@ -99,7 +99,7 @@ bool ShenandoahSimpleBitMap::is_forward_consecutive_ones(idx_t start_idx, idx_t
start_idx, count);
assert(start_idx + count <= (idx_t) _num_bits, "precondition");
size_t array_idx = start_idx >> LogBitsPerWord;
uintx bit_number = start_idx & right_n_bits(LogBitsPerWord);
uintx bit_number = start_idx & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
uintx bits_to_examine = BitsPerWord - bit_number;
element_bits >>= bit_number;
@ -128,7 +128,7 @@ bool ShenandoahSimpleBitMap::is_backward_consecutive_ones(idx_t last_idx, idx_t
assert((last_idx >= 0) && (last_idx < _num_bits), "precondition");
assert(last_idx - count >= -1, "precondition");
size_t array_idx = last_idx >> LogBitsPerWord;
uintx bit_number = last_idx & right_n_bits(LogBitsPerWord);
uintx bit_number = last_idx & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
uintx bits_to_examine = bit_number + 1;
element_bits <<= (BitsPerWord - bits_to_examine);
@ -161,10 +161,10 @@ idx_t ShenandoahSimpleBitMap::find_first_consecutive_set_bits(idx_t beg, idx_t e
return end;
}
uintx array_idx = beg >> LogBitsPerWord;
uintx bit_number = beg & right_n_bits(LogBitsPerWord);
uintx bit_number = beg & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
if (bit_number > 0) {
uintx mask_out = right_n_bits(bit_number);
uintx mask_out = tail_mask(bit_number);
element_bits &= ~mask_out;
}
@ -222,9 +222,9 @@ idx_t ShenandoahSimpleBitMap::find_first_consecutive_set_bits(idx_t beg, idx_t e
}
array_idx = beg >> LogBitsPerWord;
element_bits = _bitmap[array_idx];
bit_number = beg & right_n_bits(LogBitsPerWord);
bit_number = beg & (BitsPerWord - 1);
if (bit_number > 0) {
size_t mask_out = right_n_bits(bit_number);
size_t mask_out = tail_mask(bit_number);
element_bits &= ~mask_out;
}
}
@ -242,10 +242,10 @@ idx_t ShenandoahSimpleBitMap::find_last_consecutive_set_bits(const idx_t beg, id
}
size_t array_idx = end >> LogBitsPerWord;
uintx bit_number = end & right_n_bits(LogBitsPerWord);
uintx bit_number = end & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
if (bit_number < BitsPerWord - 1) {
uintx mask_in = right_n_bits(bit_number + 1);
uintx mask_in = tail_mask(bit_number + 1);
element_bits &= mask_in;
}
@ -280,10 +280,10 @@ idx_t ShenandoahSimpleBitMap::find_last_consecutive_set_bits(const idx_t beg, id
return beg;
}
array_idx = end >> LogBitsPerWord;
bit_number = end & right_n_bits(LogBitsPerWord);
bit_number = end & (BitsPerWord - 1);
element_bits = _bitmap[array_idx];
if (bit_number < BitsPerWord - 1){
size_t mask_in = right_n_bits(bit_number + 1);
size_t mask_in = tail_mask(bit_number + 1);
element_bits &= mask_in;
}
}

View File

@ -50,7 +50,7 @@ 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 violatee through future software maintenance.
// might be violated through future software maintenance.
class ShenandoahSimpleBitMap {
const idx_t _num_bits;
const size_t _num_words;
@ -80,11 +80,13 @@ private:
bool is_forward_consecutive_ones(idx_t start_idx, idx_t count) const;
bool is_backward_consecutive_ones(idx_t last_idx, idx_t count) const;
static inline uintx tail_mask(uintx bit_number);
public:
inline idx_t aligned_index(idx_t idx) const {
assert((idx >= 0) && (idx < _num_bits), "precondition");
idx_t array_idx = idx & ~right_n_bits(LogBitsPerWord);
idx_t array_idx = idx & ~(BitsPerWord - 1);
return array_idx;
}
@ -107,7 +109,7 @@ public:
inline void set_bit(idx_t idx) {
assert((idx >= 0) && (idx < _num_bits), "precondition");
size_t array_idx = idx >> LogBitsPerWord;
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
uintx bit_number = idx & (BitsPerWord - 1);
uintx the_bit = nth_bit(bit_number);
_bitmap[array_idx] |= the_bit;
}
@ -116,7 +118,7 @@ public:
assert((idx >= 0) && (idx < _num_bits), "precondition");
assert(idx >= 0, "precondition");
size_t array_idx = idx >> LogBitsPerWord;
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
uintx bit_number = idx & (BitsPerWord - 1);
uintx the_bit = nth_bit(bit_number);
_bitmap[array_idx] &= ~the_bit;
}
@ -125,9 +127,9 @@ public:
assert((idx >= 0) && (idx < _num_bits), "precondition");
assert(idx >= 0, "precondition");
size_t array_idx = idx >> LogBitsPerWord;
uintx bit_number = idx & right_n_bits(LogBitsPerWord);
uintx bit_number = idx & (BitsPerWord - 1);
uintx the_bit = nth_bit(bit_number);
return (_bitmap[array_idx] & the_bit)? true: false;
return (_bitmap[array_idx] & the_bit) != 0;
}
// Return the index of the first set bit in the range [beg, size()), or size() if none found.

View File

@ -27,15 +27,22 @@
#include "gc/shenandoah/shenandoahSimpleBitMap.hpp"
inline uintx ShenandoahSimpleBitMap::tail_mask(uintx bit_number) {
if (bit_number >= BitsPerWord) {
return -1;
}
return (uintx(1) << bit_number) - 1;
}
inline idx_t ShenandoahSimpleBitMap::find_first_set_bit(idx_t beg, idx_t end) const {
assert((beg >= 0) && (beg < _num_bits), "precondition");
assert((end > beg) && (end <= _num_bits), "precondition");
do {
size_t array_idx = beg >> LogBitsPerWord;
uintx bit_number = beg & right_n_bits(LogBitsPerWord);
uintx bit_number = beg & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
if (bit_number > 0) {
uintx mask_out = right_n_bits(bit_number);
uintx mask_out = tail_mask(bit_number);
element_bits &= ~mask_out;
}
if (element_bits) {
@ -62,10 +69,10 @@ inline idx_t ShenandoahSimpleBitMap::find_last_set_bit(idx_t beg, idx_t end) con
assert((beg >= -1) && (beg < end), "precondition");
do {
idx_t array_idx = end >> LogBitsPerWord;
uintx bit_number = end & right_n_bits(LogBitsPerWord);
uint8_t bit_number = end & (BitsPerWord - 1);
uintx element_bits = _bitmap[array_idx];
if (bit_number < BitsPerWord - 1){
uintx mask_in = right_n_bits(bit_number + 1);
uintx mask_in = tail_mask(bit_number + 1);
element_bits &= mask_in;
}
if (element_bits) {

View File

@ -488,7 +488,8 @@ static bool rule_major_allocation_rate(const ZDirectorStats& stats) {
// Calculate the GC cost for each reclaimed byte
const double current_young_gc_time_per_bytes_freed = double(young_gc_time) / double(reclaimed_per_young_gc);
const double current_old_gc_time_per_bytes_freed = double(old_gc_time) / double(reclaimed_per_old_gc);
const double current_old_gc_time_per_bytes_freed = reclaimed_per_old_gc == 0 ? std::numeric_limits<double>::infinity()
: (double(old_gc_time) / double(reclaimed_per_old_gc));
// Calculate extra time per young collection inflicted by *not* doing an
// old collection that frees up memory in the old generation.

View File

@ -80,6 +80,15 @@ bool JVMCIGlobals::check_jvmci_flags_are_consistent() {
CHECK_NOT_SET(LibJVMCICompilerThreadHidden, UseJVMCICompiler)
if (UseJVMCICompiler) {
if (!FLAG_IS_DEFAULT(EnableJVMCI) && !EnableJVMCI) {
jio_fprintf(defaultStream::error_stream(),
"Improperly specified VM option UseJVMCICompiler: EnableJVMCI cannot be disabled\n");
return false;
}
FLAG_SET_DEFAULT(EnableJVMCI, true);
}
if (EnableJVMCI) {
if (FLAG_IS_DEFAULT(UseJVMCINativeLibrary) && !UseJVMCINativeLibrary) {
char path[JVM_MAXPATHLEN];
if (os::dll_locate_lib(path, sizeof(path), Arguments::get_dll_dir(), JVMCI_SHARED_LIBRARY_NAME)) {
@ -88,12 +97,9 @@ bool JVMCIGlobals::check_jvmci_flags_are_consistent() {
FLAG_SET_DEFAULT(UseJVMCINativeLibrary, true);
}
}
if (!FLAG_IS_DEFAULT(EnableJVMCI) && !EnableJVMCI) {
jio_fprintf(defaultStream::error_stream(),
"Improperly specified VM option UseJVMCICompiler: EnableJVMCI cannot be disabled\n");
return false;
}
FLAG_SET_DEFAULT(EnableJVMCI, true);
}
if (UseJVMCICompiler) {
if (BootstrapJVMCI && UseJVMCINativeLibrary) {
jio_fprintf(defaultStream::error_stream(), "-XX:+BootstrapJVMCI is not compatible with -XX:+UseJVMCINativeLibrary\n");
return false;

View File

@ -140,7 +140,7 @@ class fileStream;
product(bool, UseJVMCINativeLibrary, false, EXPERIMENTAL, \
"Execute JVMCI Java code from a shared library (\"libjvmci\") " \
"instead of loading it from class files and executing it " \
"on the HotSpot heap. Defaults to true if EnableJVMCIProduct is " \
"on the HotSpot heap. Defaults to true if EnableJVMCI is " \
"true and a JVMCI native library is available.") \
\
product(double, JVMCINativeLibraryThreadFraction, 0.33, EXPERIMENTAL, \

View File

@ -33,11 +33,11 @@
const LogSelection LogSelection::Invalid;
LogSelection::LogSelection() : _ntags(0), _wildcard(false), _level(LogLevel::Invalid), _tag_sets_selected(0) {
LogSelection::LogSelection() : _ntags(0), _tags(), _wildcard(false), _level(LogLevel::Invalid), _tag_sets_selected(0) {
}
LogSelection::LogSelection(const LogTagType tags[LogTag::MaxTags], bool wildcard, LogLevelType level)
: _ntags(0), _wildcard(wildcard), _level(level), _tag_sets_selected(0) {
: _ntags(0), _tags(), _wildcard(wildcard), _level(level), _tag_sets_selected(0) {
while (_ntags < LogTag::MaxTags && tags[_ntags] != LogTag::__NO_TAG) {
_tags[_ntags] = tags[_ntags];
_ntags++;

View File

@ -1483,12 +1483,18 @@ const TypePtr *Compile::flatten_alias_type( const TypePtr *tj ) const {
} else {
ciInstanceKlass *canonical_holder = ik->get_canonical_holder(offset);
assert(offset < canonical_holder->layout_helper_size_in_bytes(), "");
if (!ik->equals(canonical_holder) || tj->offset() != offset) {
if( is_known_inst ) {
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, true, nullptr, offset, to->instance_id());
} else {
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, false, nullptr, offset);
}
assert(tj->offset() == offset, "no change to offset expected");
bool xk = to->klass_is_exact();
int instance_id = to->instance_id();
// If the input type's class is the holder: if exact, the type only includes interfaces implemented by the holder
// but if not exact, it may include extra interfaces: build new type from the holder class to make sure only
// its interfaces are included.
if (xk && ik->equals(canonical_holder)) {
assert(tj == TypeInstPtr::make(to->ptr(), canonical_holder, is_known_inst, nullptr, offset, instance_id), "exact type should be canonical type");
} else {
assert(xk || !is_known_inst, "Known instance should be exact type");
tj = to = TypeInstPtr::make(to->ptr(), canonical_holder, is_known_inst, nullptr, offset, instance_id);
}
}
}

View File

@ -648,6 +648,20 @@ Block* PhaseCFG::insert_anti_dependences(Block* LCA, Node* load, bool verify) {
// The anti-dependence constraints apply only to the fringe of this tree.
Node* initial_mem = load->in(MemNode::Memory);
// We don't optimize the memory graph for pinned loads, so we may need to raise the
// root of our search tree through the corresponding slices of MergeMem nodes to
// get to the node that really creates the memory state for this slice.
if (load_alias_idx >= Compile::AliasIdxRaw) {
while (initial_mem->is_MergeMem()) {
MergeMemNode* mm = initial_mem->as_MergeMem();
Node* p = mm->memory_at(load_alias_idx);
if (p != mm->base_memory()) {
initial_mem = p;
} else {
break;
}
}
}
worklist_store.push(initial_mem);
worklist_visited.push(initial_mem);
worklist_mem.push(nullptr);

View File

@ -1556,6 +1556,7 @@ Node* GraphKit::make_load(Node* ctl, Node* adr, const Type* t, BasicType bt,
bool mismatched,
bool unsafe,
uint8_t barrier_data) {
assert(adr_idx == C->get_alias_index(_gvn.type(adr)->isa_ptr()), "slice of address and input slice don't match");
assert(adr_idx != Compile::AliasIdxTop, "use other make_load factory" );
const TypePtr* adr_type = nullptr; // debug-mode-only argument
debug_only(adr_type = C->get_adr_type(adr_idx));
@ -1585,6 +1586,7 @@ Node* GraphKit::store_to_memory(Node* ctl, Node* adr, Node *val, BasicType bt,
bool unsafe,
int barrier_data) {
assert(adr_idx != Compile::AliasIdxTop, "use other store_to_memory factory" );
assert(adr_idx == C->get_alias_index(_gvn.type(adr)->isa_ptr()), "slice of address and input slice don't match");
const TypePtr* adr_type = nullptr;
debug_only(adr_type = C->get_adr_type(adr_idx));
Node *mem = memory(adr_idx);

View File

@ -2921,11 +2921,10 @@ bool LibraryCallKit::inline_native_notify_jvmti_funcs(address funcAddr, const ch
Node* thread = ideal.thread();
Node* jt_addr = basic_plus_adr(thread, in_bytes(JavaThread::is_in_VTMS_transition_offset()));
Node* vt_addr = basic_plus_adr(vt_oop, java_lang_Thread::is_in_VTMS_transition_offset());
const TypePtr *addr_type = _gvn.type(addr)->isa_ptr();
sync_kit(ideal);
access_store_at(nullptr, jt_addr, addr_type, hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
access_store_at(nullptr, vt_addr, addr_type, hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
access_store_at(nullptr, jt_addr, _gvn.type(jt_addr)->is_ptr(), hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
access_store_at(nullptr, vt_addr, _gvn.type(vt_addr)->is_ptr(), hide, _gvn.type(hide), T_BOOLEAN, IN_NATIVE | MO_UNORDERED);
ideal.sync_kit(this);
} ideal.end_if();
@ -3283,7 +3282,9 @@ bool LibraryCallKit::inline_native_getEventWriter() {
// Load the raw epoch value from the threadObj.
Node* threadObj_epoch_offset = basic_plus_adr(threadObj, java_lang_Thread::jfr_epoch_offset());
Node* threadObj_epoch_raw = access_load_at(threadObj, threadObj_epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
Node* threadObj_epoch_raw = access_load_at(threadObj, threadObj_epoch_offset,
_gvn.type(threadObj_epoch_offset)->isa_ptr(),
TypeInt::CHAR, T_CHAR,
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
// Mask off the excluded information from the epoch.
@ -3298,7 +3299,8 @@ bool LibraryCallKit::inline_native_getEventWriter() {
// Load the raw epoch value from the vthread.
Node* vthread_epoch_offset = basic_plus_adr(vthread, java_lang_Thread::jfr_epoch_offset());
Node* vthread_epoch_raw = access_load_at(vthread, vthread_epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
Node* vthread_epoch_raw = access_load_at(vthread, vthread_epoch_offset, _gvn.type(vthread_epoch_offset)->is_ptr(),
TypeInt::CHAR, T_CHAR,
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
// Mask off the excluded information from the epoch.
@ -3534,7 +3536,7 @@ void LibraryCallKit::extend_setCurrentThread(Node* jt, Node* thread) {
// Load the raw epoch value from the vthread.
Node* epoch_offset = basic_plus_adr(thread, java_lang_Thread::jfr_epoch_offset());
Node* epoch_raw = access_load_at(thread, epoch_offset, TypeRawPtr::BOTTOM, TypeInt::CHAR, T_CHAR,
Node* epoch_raw = access_load_at(thread, epoch_offset, _gvn.type(epoch_offset)->is_ptr(), TypeInt::CHAR, T_CHAR,
IN_HEAP | MO_UNORDERED | C2_MISMATCHED | C2_CONTROL_DEPENDENT_LOAD);
// Mask off the excluded information from the epoch.

View File

@ -1918,12 +1918,28 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_
// Since stride > 0 and limit_correction <= stride + 1, we can restate this with no over- or underflow into:
// max_int - canonicalized_correction - limit_correction >= limit
// Since canonicalized_correction and limit_correction are both constants, we can replace them with a new constant:
// final_correction = canonicalized_correction + limit_correction
// (v) final_correction = canonicalized_correction + limit_correction
//
// which gives us:
//
// Final predicate condition:
// max_int - final_correction >= limit
//
// However, we need to be careful that (v) does not over- or underflow.
// We know that:
// canonicalized_correction = stride - 1
// and
// limit_correction <= stride + 1
// and thus
// canonicalized_correction + limit_correction <= 2 * stride
// To prevent an over- or underflow of (v), we must ensure that
// 2 * stride <= max_int
// which can safely be checked without over- or underflow with
// (vi) stride != min_int AND abs(stride) <= max_int / 2
//
// We could try to further optimize the cases where (vi) does not hold but given that such large strides are
// very uncommon and the loop would only run for a very few iterations anyway, we simply bail out if (vi) fails.
//
// (2) Loop Limit Check Predicate for (ii):
// Using (ii): init < limit
//
@ -1954,6 +1970,10 @@ bool PhaseIdealLoop::is_counted_loop(Node* x, IdealLoopTree*&loop, BasicType iv_
// there is no overflow of the iv phi after the first iteration. In this case, we don't need to check (ii)
// again and can skip the predicate.
// Check (vi) and bail out if the stride is too big.
if (stride_con == min_signed_integer(iv_bt) || (ABS(stride_con) > max_signed_integer(iv_bt) / 2)) {
return false;
}
// Accounting for (LE3) and (LE4) where we use pre-incremented phis in the loop exit check.
const jlong limit_correction_for_pre_iv_exit_check = (phi_incr != nullptr) ? stride_con : 0;
@ -5473,7 +5493,8 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
} else { // Else not a nested loop
if (!_loop_or_ctrl[m->_idx]) continue; // Dead code has no loop
l = get_loop(m); // Get previously determined loop
IdealLoopTree* m_loop = get_loop(m);
l = m_loop; // Get previously determined loop
// If successor is header of a loop (nest), move up-loop till it
// is a member of some outer enclosing loop. Since there are no
// shared headers (I've split them already) I only need to go up
@ -5499,10 +5520,10 @@ int PhaseIdealLoop::build_loop_tree_impl( Node *n, int pre_order ) {
// Insert the NeverBranch between 'm' and it's control user.
NeverBranchNode *iff = new NeverBranchNode( m );
_igvn.register_new_node_with_optimizer(iff);
set_loop(iff, l);
set_loop(iff, m_loop);
Node *if_t = new CProjNode( iff, 0 );
_igvn.register_new_node_with_optimizer(if_t);
set_loop(if_t, l);
set_loop(if_t, m_loop);
Node* cfg = nullptr; // Find the One True Control User of m
for (DUIterator_Fast jmax, j = m->fast_outs(jmax); j < jmax; j++) {

View File

@ -358,7 +358,7 @@ class Parse : public GraphKit {
bool _wrote_volatile; // Did we write a volatile field?
bool _wrote_stable; // Did we write a @Stable field?
bool _wrote_fields; // Did we write any field?
Node* _alloc_with_final; // An allocation node with final field
Node* _alloc_with_final_or_stable; // An allocation node with final or @Stable field
// Variables which track Java semantics during bytecode parsing:
@ -403,10 +403,10 @@ class Parse : public GraphKit {
void set_wrote_stable(bool z) { _wrote_stable = z; }
bool wrote_fields() const { return _wrote_fields; }
void set_wrote_fields(bool z) { _wrote_fields = z; }
Node* alloc_with_final() const { return _alloc_with_final; }
void set_alloc_with_final(Node* n) {
assert((_alloc_with_final == nullptr) || (_alloc_with_final == n), "different init objects?");
_alloc_with_final = n;
Node* alloc_with_final_or_stable() const { return _alloc_with_final_or_stable; }
void set_alloc_with_final_or_stable(Node* n) {
assert((_alloc_with_final_or_stable == nullptr) || (_alloc_with_final_or_stable == n), "different init objects?");
_alloc_with_final_or_stable = n;
}
Block* block() const { return _block; }

View File

@ -412,7 +412,7 @@ Parse::Parse(JVMState* caller, ciMethod* parse_method, float expected_uses)
_wrote_volatile = false;
_wrote_stable = false;
_wrote_fields = false;
_alloc_with_final = nullptr;
_alloc_with_final_or_stable = nullptr;
_block = nullptr;
_first_return = true;
_replaced_nodes_for_exceptions = false;
@ -987,8 +987,8 @@ void Parse::do_exits() {
// Figure out if we need to emit the trailing barrier. The barrier is only
// needed in the constructors, and only in three cases:
//
// 1. The constructor wrote a final. The effects of all initializations
// must be committed to memory before any code after the constructor
// 1. The constructor wrote a final or a @Stable field. All these
// initializations must be ordered before any code after the constructor
// publishes the reference to the newly constructed object. Rather
// than wait for the publication, we simply block the writes here.
// Rather than put a barrier on only those writes which are required
@ -1013,34 +1013,23 @@ void Parse::do_exits() {
// exceptional returns, since they cannot publish normally.
//
if (method()->is_initializer() &&
(wrote_final() ||
(wrote_final() || wrote_stable() ||
(AlwaysSafeConstructors && wrote_fields()) ||
(support_IRIW_for_not_multiple_copy_atomic_cpu && wrote_volatile()))) {
Node* recorded_alloc = alloc_with_final_or_stable();
_exits.insert_mem_bar(UseStoreStoreForCtor ? Op_MemBarStoreStore : Op_MemBarRelease,
alloc_with_final());
recorded_alloc);
// If Memory barrier is created for final fields write
// and allocation node does not escape the initialize method,
// then barrier introduced by allocation node can be removed.
if (DoEscapeAnalysis && alloc_with_final()) {
AllocateNode* alloc = AllocateNode::Ideal_allocation(alloc_with_final());
if (DoEscapeAnalysis && (recorded_alloc != nullptr)) {
AllocateNode* alloc = AllocateNode::Ideal_allocation(recorded_alloc);
alloc->compute_MemBar_redundancy(method());
}
if (PrintOpto && (Verbose || WizardMode)) {
method()->print_name();
tty->print_cr(" writes finals and needs a memory barrier");
}
}
// Any method can write a @Stable field; insert memory barriers
// after those also. Can't bind predecessor allocation node (if any)
// with barrier because allocation doesn't always dominate
// MemBarRelease.
if (wrote_stable()) {
_exits.insert_mem_bar(Op_MemBarRelease);
if (PrintOpto && (Verbose || WizardMode)) {
method()->print_name();
tty->print_cr(" writes @Stable and needs a memory barrier");
tty->print_cr(" writes finals/@Stable and needs a memory barrier");
}
}

View File

@ -236,22 +236,25 @@ void Parse::do_put_xxx(Node* obj, ciField* field, bool is_field) {
set_wrote_fields(true);
// If the field is final, the rules of Java say we are in <init> or <clinit>.
// Note the presence of writes to final non-static fields, so that we
// If the field is @Stable, we can be in any method, but we only care about
// constructors at this point.
//
// Note the presence of writes to final/@Stable non-static fields, so that we
// can insert a memory barrier later on to keep the writes from floating
// out of the constructor.
// Any method can write a @Stable field; insert memory barriers after those also.
if (field->is_final()) {
set_wrote_final(true);
if (field->is_final() || field->is_stable()) {
if (field->is_final()) {
set_wrote_final(true);
}
if (field->is_stable()) {
set_wrote_stable(true);
}
if (AllocateNode::Ideal_allocation(obj) != nullptr) {
// Preserve allocation ptr to create precedent edge to it in membar
// generated on exit from constructor.
// Can't bind stable with its allocation, only record allocation for final field.
set_alloc_with_final(obj);
set_alloc_with_final_or_stable(obj);
}
}
if (field->is_stable()) {
set_wrote_stable(true);
}
}
}

View File

@ -97,25 +97,35 @@ jint os_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
}
}
// Get buffer size needed to read all processes
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
JNU_ThrowByNameWithLastError(env,
"java/lang/RuntimeException", "sysctl failed");
return -1;
}
int errsysctl;
int maxRetries = 100;
void *buffer = NULL;
do {
int mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0};
if (buffer != NULL) free(buffer);
// Get buffer size needed to read all processes
if (sysctl(mib, 4, NULL, &bufSize, NULL, 0) < 0) {
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "sysctl failed");
return -1;
}
// Allocate buffer big enough for all processes
void *buffer = malloc(bufSize);
if (buffer == NULL) {
JNU_ThrowOutOfMemoryError(env, "malloc failed");
return -1;
}
// Allocate buffer big enough for all processes; add a little
// bit of space to be able to hold a few more proc infos
// for processes started right after the first sysctl call
buffer = malloc(bufSize + 4 * sizeof(struct kinfo_proc));
if (buffer == NULL) {
JNU_ThrowOutOfMemoryError(env, "malloc failed");
return -1;
}
// Read process info for all processes
if (sysctl(mib, 4, buffer, &bufSize, NULL, 0) < 0) {
JNU_ThrowByNameWithLastError(env,
"java/lang/RuntimeException", "sysctl failed");
// Read process info for all processes
errsysctl = sysctl(mib, 4, buffer, &bufSize, NULL, 0);
} while (errsysctl < 0 && errno == ENOMEM && maxRetries-- > 0);
if (errsysctl < 0) {
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "sysctl failed to get info about all processes");
free(buffer);
return -1;
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2008, 2022, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2008, 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
@ -27,6 +27,8 @@ package java.lang.invoke;
import jdk.internal.loader.ClassLoaders;
import jdk.internal.vm.annotation.DontInline;
import jdk.internal.vm.annotation.ForceInline;
import jdk.internal.vm.annotation.IntrinsicCandidate;
import java.lang.constant.ClassDesc;
@ -856,6 +858,7 @@ public abstract sealed class MethodHandle implements Constable
* @throws WrongMethodTypeException if the conversion cannot be made
* @see MethodHandles#explicitCastArguments
*/
@ForceInline
public final MethodHandle asType(MethodType newType) {
// Fast path alternative to a heavyweight {@code asType} call.
// Return 'this' if the conversion will be a no-op.
@ -867,7 +870,7 @@ public abstract sealed class MethodHandle implements Constable
if (at != null) {
return at;
}
return setAsTypeCache(asTypeUncached(newType));
return setAsTypeCache(newType);
}
private MethodHandle asTypeCached(MethodType newType) {
@ -885,7 +888,16 @@ public abstract sealed class MethodHandle implements Constable
return null;
}
private MethodHandle setAsTypeCache(MethodHandle at) {
/*
* We disable inlining here to prevent complex code in the slow path
* of MethodHandle::asType from being inlined into that method.
* Excessive inlining into MethodHandle::asType can cause that method
* to become too big, which will then cause performance issues during
* var handle and method handle calls.
*/
@DontInline
private MethodHandle setAsTypeCache(MethodType newType) {
MethodHandle at = asTypeUncached(newType);
// Don't introduce a strong reference in the cache if newType depends on any class loader other than
// current method handle already does to avoid class loader leaks.
if (isSafeToCache(at.type)) {
@ -1879,8 +1891,7 @@ assertEquals("[three, thee, tee]", asListFix.invoke((Object)argv).toString());
if (oldForm != newForm) {
assert (newForm.customized == null || newForm.customized == this);
newForm.prepare(); // as in MethodHandle.<init>
UNSAFE.putReference(this, FORM_OFFSET, newForm);
UNSAFE.fullFence();
UNSAFE.putReferenceRelease(this, FORM_OFFSET, newForm); // properly publish newForm
}
} finally {
updateInProgress = false;

View File

@ -1132,7 +1132,6 @@ public final class Main {
}
}
KeyStore cakstore = buildTrustedCerts();
// -trustcacerts can be specified on -importcert, -printcert or -printcrl.
// Reset it so that warnings on CA cert will remain for other command.
if (command != IMPORTCERT && command != PRINTCERT
@ -1141,6 +1140,7 @@ public final class Main {
}
if (trustcacerts) {
KeyStore cakstore = buildTrustedCerts();
if (cakstore != null) {
caks = cakstore;
} else {

View File

@ -264,7 +264,13 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
}
private String toGMTFormat(String id, boolean daylight, Locale l) {
var zr = ZoneInfoFile.getZoneInfo(id).toZoneId().getRules();
LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l);
ResourceBundle fd = lr.getJavaTimeFormatData();
var zi = ZoneInfoFile.getZoneInfo(id);
if (zi == null) {
return fd.getString("timezone.gmtZeroFormat");
}
var zr = zi.toZoneId().getRules();
var now = Instant.now();
var saving = zr.getTransitions().reversed().stream()
.dropWhile(zot -> zot.getInstant().isAfter(now))
@ -276,8 +282,6 @@ public class CLDRTimeZoneNameProviderImpl extends TimeZoneNameProviderImpl {
.orElse(0);
int offset = (zr.getStandardOffset(now).getTotalSeconds() +
(daylight ? saving : 0)) / 60;
LocaleResources lr = LocaleProviderAdapter.forType(Type.CLDR).getLocaleResources(l);
ResourceBundle fd = lr.getJavaTimeFormatData();
if (offset == 0) {
return fd.getString("timezone.gmtZeroFormat");

View File

@ -21,4 +21,4 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
tzdata2024a
tzdata2024b

View File

@ -126,17 +126,16 @@ Zone Africa/Algiers 0:12:12 - LMT 1891 Mar 16
# Cape Verde / Cabo Verde
#
# From Paul Eggert (2018-02-16):
# Shanks gives 1907 for the transition to +02.
# For now, ignore that and follow the 1911-05-26 Portuguese decree
# (see Europe/Lisbon).
# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
# For timestamps before independence, see commentary for Europe/Lisbon.
# Shanks gives 1907 instead for the transition to -02.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Cape_Verde -1:34:04 - LMT 1912 Jan 01 2:00u # Praia
-2:00 - -02 1942 Sep
-2:00 1:00 -01 1945 Oct 15
-2:00 - -02 1975 Nov 25 2:00
-1:00 - -01
-2:00 - %z 1942 Sep
-2:00 1:00 %z 1945 Oct 15
-2:00 - %z 1975 Nov 25 2:00
-1:00 - %z
# Chad
# Zone NAME STDOFF RULES FORMAT [UNTIL]
@ -368,14 +367,12 @@ Zone Africa/Cairo 2:05:09 - LMT 1900 Oct
# Guinea-Bissau
#
# From Paul Eggert (2018-02-16):
# Shanks gives 1911-05-26 for the transition to WAT,
# evidently confusing the date of the Portuguese decree
# (see Europe/Lisbon) with the date that it took effect.
# From Tim Parenti (2024-07-01), per Paul Eggert (2018-02-16):
# For timestamps before independence, see commentary for Europe/Lisbon.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
-1:00 - -01 1975
-1:00 - %z 1975
0:00 - GMT
# Comoros
@ -440,10 +437,10 @@ Zone Africa/Bissau -1:02:20 - LMT 1912 Jan 1 1:00u
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Nairobi 2:27:16 - LMT 1908 May
2:30 - +0230 1928 Jun 30 24:00
2:30 - %z 1928 Jun 30 24:00
3:00 - EAT 1930 Jan 4 24:00
2:30 - +0230 1936 Dec 31 24:00
2:45 - +0245 1942 Jul 31 24:00
2:30 - %z 1936 Dec 31 24:00
2:45 - %z 1942 Jul 31 24:00
3:00 - EAT
# Liberia
@ -614,7 +611,7 @@ Rule Mauritius 2008 only - Oct lastSun 2:00 1:00 -
Rule Mauritius 2009 only - Mar lastSun 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Mauritius 3:50:00 - LMT 1907 # Port Louis
4:00 Mauritius +04/+05
4:00 Mauritius %z
# Agalega Is, Rodriguez
# no information; probably like Indian/Mauritius
@ -1094,10 +1091,10 @@ Rule Morocco 2087 only - May 11 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
0:00 Morocco +00/+01 1984 Mar 16
1:00 - +01 1986
0:00 Morocco +00/+01 2018 Oct 28 3:00
1:00 Morocco +01/+00
0:00 Morocco %z 1984 Mar 16
1:00 - %z 1986
0:00 Morocco %z 2018 Oct 28 3:00
1:00 Morocco %z
# Western Sahara
#
@ -1111,9 +1108,9 @@ Zone Africa/Casablanca -0:30:20 - LMT 1913 Oct 26
# since most of it was then controlled by Morocco.
Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
-1:00 - -01 1976 Apr 14
0:00 Morocco +00/+01 2018 Oct 28 3:00
1:00 Morocco +01/+00
-1:00 - %z 1976 Apr 14
0:00 Morocco %z 2018 Oct 28 3:00
1:00 Morocco %z
# Botswana
# Burundi
@ -1124,13 +1121,27 @@ Zone Africa/El_Aaiun -0:52:48 - LMT 1934 Jan # El Aaiún
# Zambia
# Zimbabwe
#
# Shanks gives 1903-03-01 for the transition to CAT.
# Perhaps the 1911-05-26 Portuguese decree
# https://dre.pt/pdf1sdip/1911/05/12500/23132313.pdf
# merely made it official?
# From Tim Parenti (2024-07-01):
# For timestamps before Mozambique's independence, see commentary for
# Europe/Lisbon.
#
# From Paul Eggert (2024-05-24):
# The London Gazette, 1903-04-03, page 2245, says that
# as of 1903-03-03 a time ball at the port of Lourenço Marques
# (as Maputo was then called) was dropped daily at 13:00:00 LMT,
# corresponding to 22:49:41.7 GMT, so local time was +02:10:18.3.
# Conversely, the newspaper South Africa, 1909-02-09, page 321,
# says the port had just installed an apparatus that communicated
# "from the controlling clock in the new Observatory at Reuben Point ...
# exact mean South African time, i.e., 30 deg., or 2 hours East of Greenwich".
# Although Shanks gives 1903-03-01 for the transition to CAT,
# evidently the port transitioned to CAT after 1903-03-03 but before
# the Portuguese legal transition of 1912-01-01 (see Europe/Lisbon commentary).
# For lack of better info, list 1909 as the transition date.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Maputo 2:10:20 - LMT 1903 Mar
#STDOFF 2:10:18.3
Zone Africa/Maputo 2:10:18 - LMT 1909
2:00 - CAT
# Namibia
@ -1195,7 +1206,7 @@ Rule Namibia 1995 2017 - Apr Sun>=1 2:00 -1:00 WAT
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
1:30 - +0130 1903 Mar
1:30 - %z 1903 Mar
2:00 - SAST 1942 Sep 20 2:00
2:00 1:00 SAST 1943 Mar 21 2:00
2:00 - SAST 1990 Mar 21 # independence
@ -1283,7 +1294,7 @@ Zone Africa/Windhoek 1:08:24 - LMT 1892 Feb 8
Zone Africa/Lagos 0:13:35 - LMT 1905 Jul 1
0:00 - GMT 1908 Jul 1
0:13:35 - LMT 1914 Jan 1
0:30 - +0030 1919 Sep 1
0:30 - %z 1919 Sep 1
1:00 - WAT
# São Tomé and Príncipe

View File

@ -110,34 +110,34 @@
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Casey 0 - -00 1969
8:00 - +08 2009 Oct 18 2:00
11:00 - +11 2010 Mar 5 2:00
8:00 - +08 2011 Oct 28 2:00
11:00 - +11 2012 Feb 21 17:00u
8:00 - +08 2016 Oct 22
11:00 - +11 2018 Mar 11 4:00
8:00 - +08 2018 Oct 7 4:00
11:00 - +11 2019 Mar 17 3:00
8:00 - +08 2019 Oct 4 3:00
11:00 - +11 2020 Mar 8 3:00
8:00 - +08 2020 Oct 4 0:01
11:00 - +11 2021 Mar 14 0:00
8:00 - +08 2021 Oct 3 0:01
11:00 - +11 2022 Mar 13 0:00
8:00 - +08 2022 Oct 2 0:01
11:00 - +11 2023 Mar 9 3:00
8:00 - +08
8:00 - %z 2009 Oct 18 2:00
11:00 - %z 2010 Mar 5 2:00
8:00 - %z 2011 Oct 28 2:00
11:00 - %z 2012 Feb 21 17:00u
8:00 - %z 2016 Oct 22
11:00 - %z 2018 Mar 11 4:00
8:00 - %z 2018 Oct 7 4:00
11:00 - %z 2019 Mar 17 3:00
8:00 - %z 2019 Oct 4 3:00
11:00 - %z 2020 Mar 8 3:00
8:00 - %z 2020 Oct 4 0:01
11:00 - %z 2021 Mar 14 0:00
8:00 - %z 2021 Oct 3 0:01
11:00 - %z 2022 Mar 13 0:00
8:00 - %z 2022 Oct 2 0:01
11:00 - %z 2023 Mar 9 3:00
8:00 - %z
Zone Antarctica/Davis 0 - -00 1957 Jan 13
7:00 - +07 1964 Nov
7:00 - %z 1964 Nov
0 - -00 1969 Feb
7:00 - +07 2009 Oct 18 2:00
5:00 - +05 2010 Mar 10 20:00u
7:00 - +07 2011 Oct 28 2:00
5:00 - +05 2012 Feb 21 20:00u
7:00 - +07
7:00 - %z 2009 Oct 18 2:00
5:00 - %z 2010 Mar 10 20:00u
7:00 - %z 2011 Oct 28 2:00
5:00 - %z 2012 Feb 21 20:00u
7:00 - %z
Zone Antarctica/Mawson 0 - -00 1954 Feb 13
6:00 - +06 2009 Oct 18 2:00
5:00 - +05
6:00 - %z 2009 Oct 18 2:00
5:00 - %z
# References:
# Casey Weather (1998-02-26)
# http://www.antdiv.gov.au/aad/exop/sfo/casey/casey_aws.html
@ -313,10 +313,10 @@ Zone Antarctica/Troll 0 - -00 2005 Feb 12
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Vostok 0 - -00 1957 Dec 16
7:00 - +07 1994 Feb
7:00 - %z 1994 Feb
0 - -00 1994 Nov
7:00 - +07 2023 Dec 18 2:00
5:00 - +05
7:00 - %z 2023 Dec 18 2:00
5:00 - %z
# S Africa - year-round bases
# Marion Island, -4653+03752
@ -349,7 +349,7 @@ Zone Antarctica/Vostok 0 - -00 1957 Dec 16
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Rothera 0 - -00 1976 Dec 1
-3:00 - -03
-3:00 - %z
# Uruguay - year round base
# Artigas, King George Island, -621104-0585107

View File

@ -106,8 +106,8 @@ Rule RussiaAsia 1996 2010 - Oct lastSun 2:00s 0 -
# Afghanistan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kabul 4:36:48 - LMT 1890
4:00 - +04 1945
4:30 - +0430
4:00 - %z 1945
4:30 - %z
# Armenia
# From Paul Eggert (2006-03-22):
@ -139,12 +139,12 @@ Rule Armenia 2011 only - Mar lastSun 2:00s 1:00 -
Rule Armenia 2011 only - Oct lastSun 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yerevan 2:58:00 - LMT 1924 May 2
3:00 - +03 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1995 Sep 24 2:00s
4:00 - +04 1997
4:00 RussiaAsia +04/+05 2011
4:00 Armenia +04/+05
3:00 - %z 1957 Mar
4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia %z 1995 Sep 24 2:00s
4:00 - %z 1997
4:00 RussiaAsia %z 2011
4:00 Armenia %z
# Azerbaijan
@ -165,12 +165,12 @@ Rule Azer 1997 2015 - Mar lastSun 4:00 1:00 -
Rule Azer 1997 2015 - Oct lastSun 5:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baku 3:19:24 - LMT 1924 May 2
3:00 - +03 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1992 Sep lastSun 2:00s
4:00 - +04 1996
4:00 EUAsia +04/+05 1997
4:00 Azer +04/+05
3:00 - %z 1957 Mar
4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia %z 1992 Sep lastSun 2:00s
4:00 - %z 1996
4:00 EUAsia %z 1997
4:00 Azer %z
# Bangladesh
# From Alexander Krivenyshev (2009-05-13):
@ -251,17 +251,17 @@ Rule Dhaka 2009 only - Dec 31 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dhaka 6:01:40 - LMT 1890
5:53:20 - HMT 1941 Oct # Howrah Mean Time?
6:30 - +0630 1942 May 15
5:30 - +0530 1942 Sep
6:30 - +0630 1951 Sep 30
6:00 - +06 2009
6:00 Dhaka +06/+07
6:30 - %z 1942 May 15
5:30 - %z 1942 Sep
6:30 - %z 1951 Sep 30
6:00 - %z 2009
6:00 Dhaka %z
# Bhutan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
5:30 - +0530 1987 Oct
6:00 - +06
5:30 - %z 1987 Oct
6:00 - %z
# British Indian Ocean Territory
# Whitman and the 1995 CIA time zone map say 5:00, but the
@ -271,8 +271,8 @@ Zone Asia/Thimphu 5:58:36 - LMT 1947 Aug 15 # or Thimbu
# then contained the Chagos Archipelago).
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Chagos 4:49:40 - LMT 1907
5:00 - +05 1996
6:00 - +06
5:00 - %z 1996
6:00 - %z
# Cocos (Keeling) Islands
# Myanmar (Burma)
@ -288,9 +288,9 @@ Zone Indian/Chagos 4:49:40 - LMT 1907
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Yangon 6:24:47 - LMT 1880 # or Rangoon
6:24:47 - RMT 1920 # Rangoon local time
6:30 - +0630 1942 May
9:00 - +09 1945 May 3
6:30 - +0630
6:30 - %z 1942 May
9:00 - %z 1945 May 3
6:30 - %z
# China
@ -679,7 +679,7 @@ Zone Asia/Shanghai 8:05:43 - LMT 1901
# Xinjiang time, used by many in western China; represented by Ürümqi / Ürümchi
# / Wulumuqi. (Please use Asia/Shanghai if you prefer Beijing time.)
Zone Asia/Urumqi 5:50:20 - LMT 1928
6:00 - +06
6:00 - %z
# Hong Kong
@ -1137,7 +1137,7 @@ Rule Macau 1979 only - Oct Sun>=16 03:30 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Macau 7:34:10 - LMT 1904 Oct 30
8:00 - CST 1941 Dec 21 23:00
9:00 Macau +09/+10 1945 Sep 30 24:00
9:00 Macau %z 1945 Sep 30 24:00
8:00 Macau C%sT
@ -1180,7 +1180,7 @@ Zone Asia/Nicosia 2:13:28 - LMT 1921 Nov 14
Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
2:00 Cyprus EE%sT 1998 Sep
2:00 EUAsia EE%sT 2016 Sep 8
3:00 - +03 2017 Oct 29 1:00u
3:00 - %z 2017 Oct 29 1:00u
2:00 EUAsia EE%sT
# Georgia
@ -1221,18 +1221,25 @@ Zone Asia/Famagusta 2:15:48 - LMT 1921 Nov 14
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tbilisi 2:59:11 - LMT 1880
2:59:11 - TBMT 1924 May 2 # Tbilisi Mean Time
3:00 - +03 1957 Mar
4:00 RussiaAsia +04/+05 1991 Mar 31 2:00s
3:00 RussiaAsia +03/+04 1992
3:00 E-EurAsia +03/+04 1994 Sep lastSun
4:00 E-EurAsia +04/+05 1996 Oct lastSun
4:00 1:00 +05 1997 Mar lastSun
4:00 E-EurAsia +04/+05 2004 Jun 27
3:00 RussiaAsia +03/+04 2005 Mar lastSun 2:00
4:00 - +04
3:00 - %z 1957 Mar
4:00 RussiaAsia %z 1991 Mar 31 2:00s
3:00 RussiaAsia %z 1992
3:00 E-EurAsia %z 1994 Sep lastSun
4:00 E-EurAsia %z 1996 Oct lastSun
4:00 1:00 %z 1997 Mar lastSun
4:00 E-EurAsia %z 2004 Jun 27
3:00 RussiaAsia %z 2005 Mar lastSun 2:00
4:00 - %z
# East Timor
# From Tim Parenti (2024-07-01):
# The 1912-01-01 transition occurred at 00:00 new time, per the 1911-05-24
# Portuguese decree (see Europe/Lisbon). A provision in article 5(c) of the
# decree prescribed that Timor "will keep counting time in harmony with
# neighboring foreign colonies, [for] as long as they do not adopt the time
# that belongs to them in [the Washington Convention] system."
# See Indonesia for the 1945 transition.
# From João Carrascalão, brother of the former governor of East Timor, in
@ -1256,11 +1263,11 @@ Zone Asia/Tbilisi 2:59:11 - LMT 1880
# midnight on Saturday, September 16.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dili 8:22:20 - LMT 1912 Jan 1
8:00 - +08 1942 Feb 21 23:00
9:00 - +09 1976 May 3
8:00 - +08 2000 Sep 17 0:00
9:00 - +09
Zone Asia/Dili 8:22:20 - LMT 1911 Dec 31 16:00u
8:00 - %z 1942 Feb 21 23:00
9:00 - %z 1976 May 3
8:00 - %z 2000 Sep 17 0:00
9:00 - %z
# India
@ -1326,9 +1333,9 @@ Zone Asia/Kolkata 5:53:28 - LMT 1854 Jun 28 # Kolkata
5:53:20 - HMT 1870 # Howrah Mean Time?
5:21:10 - MMT 1906 Jan 1 # Madras local time
5:30 - IST 1941 Oct
5:30 1:00 +0630 1942 May 15
5:30 1:00 %z 1942 May 15
5:30 - IST 1942 Sep
5:30 1:00 +0630 1945 Oct 15
5:30 1:00 %z 1945 Oct 15
5:30 - IST
# Since 1970 the following are like Asia/Kolkata:
# Andaman Is
@ -1380,33 +1387,33 @@ Zone Asia/Jakarta 7:07:12 - LMT 1867 Aug 10
# Shanks & Pottenger say the next transition was at 1924 Jan 1 0:13,
# but this must be a typo.
7:07:12 - BMT 1923 Dec 31 16:40u # Batavia
7:20 - +0720 1932 Nov
7:30 - +0730 1942 Mar 23
9:00 - +09 1945 Sep 23
7:30 - +0730 1948 May
8:00 - +08 1950 May
7:30 - +0730 1964
7:20 - %z 1932 Nov
7:30 - %z 1942 Mar 23
9:00 - %z 1945 Sep 23
7:30 - %z 1948 May
8:00 - %z 1950 May
7:30 - %z 1964
7:00 - WIB
# west and central Borneo
Zone Asia/Pontianak 7:17:20 - LMT 1908 May
7:17:20 - PMT 1932 Nov # Pontianak MT
7:30 - +0730 1942 Jan 29
9:00 - +09 1945 Sep 23
7:30 - +0730 1948 May
8:00 - +08 1950 May
7:30 - +0730 1964
7:30 - %z 1942 Jan 29
9:00 - %z 1945 Sep 23
7:30 - %z 1948 May
8:00 - %z 1950 May
7:30 - %z 1964
8:00 - WITA 1988 Jan 1
7:00 - WIB
# Sulawesi, Lesser Sundas, east and south Borneo
Zone Asia/Makassar 7:57:36 - LMT 1920
7:57:36 - MMT 1932 Nov # Macassar MT
8:00 - +08 1942 Feb 9
9:00 - +09 1945 Sep 23
8:00 - %z 1942 Feb 9
9:00 - %z 1945 Sep 23
8:00 - WITA
# Maluku Islands, West Papua, Papua
Zone Asia/Jayapura 9:22:48 - LMT 1932 Nov
9:00 - +09 1944 Sep 1
9:30 - +0930 1964
9:00 - %z 1944 Sep 1
9:30 - %z 1964
9:00 - WIT
# Iran
@ -1642,9 +1649,9 @@ Rule Iran 2021 2022 - Sep 21 24:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Tehran 3:25:44 - LMT 1916
3:25:44 - TMT 1935 Jun 13 # Tehran Mean Time
3:30 Iran +0330/+0430 1977 Oct 20 24:00
4:00 Iran +04/+05 1979
3:30 Iran +0330/+0430
3:30 Iran %z 1977 Oct 20 24:00
4:00 Iran %z 1979
3:30 Iran %z
# Iraq
@ -1687,8 +1694,8 @@ Rule Iraq 1991 2007 - Oct 1 3:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Baghdad 2:57:40 - LMT 1890
2:57:36 - BMT 1918 # Baghdad Mean Time?
3:00 - +03 1982 May
3:00 Iraq +03/+04
3:00 - %z 1982 May
3:00 Iraq %z
###############################################################################
@ -2285,7 +2292,7 @@ Rule Jordan 2022 only - Feb lastThu 24:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Amman 2:23:44 - LMT 1931
2:00 Jordan EE%sT 2022 Oct 28 0:00s
3:00 - +03
3:00 - %z
# Kazakhstan
@ -2496,88 +2503,88 @@ Zone Asia/Amman 2:23:44 - LMT 1931
# Almaty (formerly Alma-Ata), representing most locations in Kazakhstan
# This includes Abai/Abay (ISO 3166-2 code KZ-10), Aqmola/Akmola (KZ-11),
# Almaty (KZ-19), Almaty city (KZ-75), Astana city (KZ-71),
# East Kazkhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
# East Kazakhstan (KZ-63), Jambyl/Zhambyl (KZ-31), Jetisu/Zhetysu (KZ-33),
# Karaganda (KZ-35), North Kazakhstan (KZ-59), Pavlodar (KZ-55),
# Shyumkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
# Shymkent city (KZ-79), Turkistan (KZ-61), and Ulytau (KZ-62).
Zone Asia/Almaty 5:07:48 - LMT 1924 May 2 # or Alma-Ata
5:00 - +05 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
6:00 RussiaAsia +06/+07 2004 Oct 31 2:00s
6:00 - +06 2024 Mar 1 0:00
5:00 - +05
5:00 - %z 1930 Jun 21
6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 RussiaAsia %z 1992 Jan 19 2:00s
6:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - %z 2024 Mar 1 0:00
5:00 - %z
# Qyzylorda (aka Kyzylorda, Kizilorda, Kzyl-Orda, etc.) (KZ-43)
Zone Asia/Qyzylorda 4:21:52 - LMT 1924 May 2
4:00 - +04 1930 Jun 21
5:00 - +05 1981 Apr 1
5:00 1:00 +06 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1991 Sep 29 2:00s
5:00 RussiaAsia +05/+06 1992 Jan 19 2:00s
6:00 RussiaAsia +06/+07 1992 Mar 29 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
6:00 - +06 2018 Dec 21 0:00
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 - %z 1981 Apr 1
5:00 1:00 %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia %z 1991 Sep 29 2:00s
5:00 RussiaAsia %z 1992 Jan 19 2:00s
6:00 RussiaAsia %z 1992 Mar 29 2:00s
5:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - %z 2018 Dec 21 0:00
5:00 - %z
# Qostanay (aka Kostanay, Kustanay) (KZ-39)
# The 1991/2 rules are unclear partly because of the 1997 Turgai
# reorganization.
Zone Asia/Qostanay 4:14:28 - LMT 1924 May 2
4:00 - +04 1930 Jun 21
5:00 - +05 1981 Apr 1
5:00 1:00 +06 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
6:00 - +06 2024 Mar 1 0:00
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 - %z 1981 Apr 1
5:00 1:00 %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia %z 2004 Oct 31 2:00s
6:00 - %z 2024 Mar 1 0:00
5:00 - %z
# Aqtöbe (aka Aktobe, formerly Aktyubinsk) (KZ-15)
Zone Asia/Aqtobe 3:48:40 - LMT 1924 May 2
4:00 - +04 1930 Jun 21
5:00 - +05 1981 Apr 1
5:00 1:00 +06 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 2004 Oct 31 2:00s
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 - %z 1981 Apr 1
5:00 1:00 %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - %z
# Mangghystaū (KZ-47)
# Aqtau was not founded until 1963, but it represents an inhabited region,
# so include timestamps before 1963.
Zone Asia/Aqtau 3:21:04 - LMT 1924 May 2
4:00 - +04 1930 Jun 21
5:00 - +05 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1994 Sep 25 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 - %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia %z 1994 Sep 25 2:00s
4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - %z
# Atyraū (KZ-23) is like Mangghystaū except it switched from
# +04/+05 to +05/+06 in spring 1999, not fall 1994.
Zone Asia/Atyrau 3:27:44 - LMT 1924 May 2
3:00 - +03 1930 Jun 21
5:00 - +05 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1999 Mar 28 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
5:00 - +05
3:00 - %z 1930 Jun 21
5:00 - %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1991 Mar 31 2:00s
4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia %z 1999 Mar 28 2:00s
4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - %z
# West Kazakhstan (KZ-27)
# From Paul Eggert (2016-03-18):
# The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Asia/Oral 3:25:24 - LMT 1924 May 2 # or Ural'sk
3:00 - +03 1930 Jun 21
5:00 - +05 1981 Apr 1
5:00 1:00 +06 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1989 Mar 26 2:00s
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00s
5:00 RussiaAsia +05/+06 1992 Mar 29 2:00s
4:00 RussiaAsia +04/+05 2004 Oct 31 2:00s
5:00 - +05
3:00 - %z 1930 Jun 21
5:00 - %z 1981 Apr 1
5:00 1:00 %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1989 Mar 26 2:00s
4:00 RussiaAsia %z 1992 Jan 19 2:00s
5:00 RussiaAsia %z 1992 Mar 29 2:00s
4:00 RussiaAsia %z 2004 Oct 31 2:00s
5:00 - %z
# Kyrgyzstan (Kirgizstan)
# Transitions through 1991 are from Shanks & Pottenger.
@ -2598,11 +2605,11 @@ Rule Kyrgyz 1997 2005 - Mar lastSun 2:30 1:00 -
Rule Kyrgyz 1997 2004 - Oct lastSun 2:30 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bishkek 4:58:24 - LMT 1924 May 2
5:00 - +05 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
5:00 RussiaAsia +05/+06 1991 Aug 31 2:00
5:00 Kyrgyz +05/+06 2005 Aug 12
6:00 - +06
5:00 - %z 1930 Jun 21
6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 RussiaAsia %z 1991 Aug 31 2:00
5:00 Kyrgyz %z 2005 Aug 12
6:00 - %z
###############################################################################
@ -2809,16 +2816,16 @@ Rule NBorneo 1935 1941 - Dec 14 0:00 0 -
# and 1982 transition dates are from Mok Ly Yng.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kuching 7:21:20 - LMT 1926 Mar
7:30 - +0730 1933
8:00 NBorneo +08/+0820 1942 Feb 16
9:00 - +09 1945 Sep 12
8:00 - +08
7:30 - %z 1933
8:00 NBorneo %z 1942 Feb 16
9:00 - %z 1945 Sep 12
8:00 - %z
# Maldives
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
4:54:00 - MMT 1960 # Malé Mean Time
5:00 - +05
5:00 - %z
# Mongolia
@ -2920,9 +2927,37 @@ Zone Indian/Maldives 4:54:00 - LMT 1880 # Malé
# From Arthur David Olson (2008-05-19):
# Assume that Choibalsan is indeed offset by 8:00.
# XXX--in the absence of better information, assume that transition
# was at the start of 2008-03-31 (the day of Steffen Thorsen's report);
# this is almost surely wrong.
# From Heitor David Pinto (2024-06-23):
# Sources about time zones in Mongolia seem to list one of two conflicting
# configurations. The first configuration, mentioned in a comment to the TZ
# database in 1999, citing a Mongolian government website, lists the provinces
# of Bayan-Ölgii, Khovd and Uvs in UTC+7, and the rest of the country in
# UTC+8. The second configuration, mentioned in a comment to the database in
# 2001, lists Bayan-Ölgii, Khovd, Uvs, Govi-Altai and Zavkhan in UTC+7, Dornod
# and Sükhbaatar in UTC+9, and the rest of the country in UTC+8.
#
# The first configuration is still mentioned by several Mongolian travel
# agencies:
# https://www.adventurerider.mn/en/page/about_mongolia
# http://www.naturetours.mn/nt/mongolia.php
# https://www.newjuulchin.mn/web/content/7506?unique=fa24a0f6e96e022a3578ee5195ac879638c734ce
#
# It also matches these flight schedules in 2013:
# http://web.archive.org/web/20130722023600/https://www.hunnuair.com/en/timetabled
# The flight times imply that the airports of Uliastai (Zavkhan), Choibalsan
# (Dornod) and Altai (Govi-Altai) are in the same time zone as Ulaanbaatar,
# and Khovd is one hour behind....
#
# The second configuration was mentioned by an official of the Mongolian
# standards agency in an interview in 2014: https://ikon.mn/n/9v6
# And it's still listed by the Mongolian aviation agency:
# https://ais.mn/files/aip/eAIP/2023-12-25/html/eSUP/ZM-eSUP-23-04-en-MN.html
#
# ... I believe that the first configuration is what is actually observed in
# Mongolia and has been so all along, at least since 1999. The second
# configuration closely matches the ideal time zone boundaries at 97.5° E and
# 112.5° E but it doesn't seem to be used in practice.
# From Ganbold Tsagaankhuu (2015-03-10):
# It seems like yesterday Mongolian Government meeting has concluded to use
@ -2961,25 +2996,18 @@ Rule Mongol 2015 2016 - Sep lastSat 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
# Hovd, a.k.a. Chovd, Dund-Us, Dzhargalant, Khovd, Jirgalanta
Zone Asia/Hovd 6:06:36 - LMT 1905 Aug
6:00 - +06 1978
7:00 Mongol +07/+08
6:00 - %z 1978
7:00 Mongol %z
# Ulaanbaatar, a.k.a. Ulan Bataar, Ulan Bator, Urga
Zone Asia/Ulaanbaatar 7:07:32 - LMT 1905 Aug
7:00 - +07 1978
8:00 Mongol +08/+09
# Choibalsan, a.k.a. Bajan Tümen, Bajan Tumen, Chojbalsan,
# Choybalsan, Sanbejse, Tchoibalsan
Zone Asia/Choibalsan 7:38:00 - LMT 1905 Aug
7:00 - +07 1978
8:00 - +08 1983 Apr
9:00 Mongol +09/+10 2008 Mar 31
8:00 Mongol +08/+09
7:00 - %z 1978
8:00 Mongol %z
# Nepal
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Kathmandu 5:41:16 - LMT 1920
5:30 - +0530 1986
5:45 - +0545
5:30 - %z 1986
5:45 - %z
# Pakistan
@ -3125,10 +3153,10 @@ Rule Pakistan 2009 only - Apr 15 0:00 1:00 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Karachi 4:28:12 - LMT 1907
5:30 - +0530 1942 Sep
5:30 1:00 +0630 1945 Oct 15
5:30 - +0530 1951 Sep 30
5:00 - +05 1971 Mar 26
5:30 - %z 1942 Sep
5:30 1:00 %z 1945 Oct 15
5:30 - %z 1951 Sep 30
5:00 - %z 1971 Mar 26
5:00 Pakistan PK%sT # Pakistan Time
# Palestine
@ -3676,14 +3704,14 @@ Zone Asia/Hebron 2:20:23 - LMT 1900 Oct
# Philippine Star 2014-08-05
# http://www.philstar.com/headlines/2014/08/05/1354152/pnoy-urged-declare-use-daylight-saving-time
# From Paul Goyette (2018-06-15):
# From Paul Goyette (2018-06-15) with URLs updated by Guy Harris (2024-02-15):
# In the Philippines, there is a national law, Republic Act No. 10535
# which declares the official time here as "Philippine Standard Time".
# The act [1] even specifies use of PST as the abbreviation, although
# the FAQ provided by PAGASA [2] uses the "acronym PhST to distinguish
# it from the Pacific Standard Time (PST)."
# [1] http://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
# [2] https://www1.pagasa.dost.gov.ph/index.php/astronomy/philippine-standard-time#republic-act-10535
# [1] https://www.officialgazette.gov.ph/2013/05/15/republic-act-no-10535/
# [2] https://prsd.pagasa.dost.gov.ph/index.php/28-astronomy/302-philippine-standard-time
#
# From Paul Eggert (2018-06-19):
# I surveyed recent news reports, and my impression is that "PST" is
@ -3716,8 +3744,8 @@ Zone Asia/Manila -15:56:00 - LMT 1844 Dec 31
# Qatar
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
4:00 - +04 1972 Jun
3:00 - +03
4:00 - %z 1972 Jun
3:00 - %z
# Kuwait
# Saudi Arabia
@ -3767,7 +3795,7 @@ Zone Asia/Qatar 3:26:08 - LMT 1920 # Al Dawhah / Doha
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
3:00 - +03
3:00 - %z
# Singapore
# taken from Mok Ly Yng (2003-10-30)
@ -3775,13 +3803,13 @@ Zone Asia/Riyadh 3:06:52 - LMT 1947 Mar 14
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
6:55:25 - SMT 1905 Jun 1 # Singapore M.T.
7:00 - +07 1933 Jan 1
7:00 0:20 +0720 1936 Jan 1
7:20 - +0720 1941 Sep 1
7:30 - +0730 1942 Feb 16
9:00 - +09 1945 Sep 12
7:30 - +0730 1981 Dec 31 16:00u
8:00 - +08
7:00 - %z 1933 Jan 1
7:00 0:20 %z 1936 Jan 1
7:20 - %z 1941 Sep 1
7:30 - %z 1942 Feb 16
9:00 - %z 1945 Sep 12
7:30 - %z 1981 Dec 31 16:00u
8:00 - %z
# Spratly Is
# no information
@ -3839,13 +3867,13 @@ Zone Asia/Singapore 6:55:25 - LMT 1901 Jan 1
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Colombo 5:19:24 - LMT 1880
5:19:32 - MMT 1906 # Moratuwa Mean Time
5:30 - +0530 1942 Jan 5
5:30 0:30 +06 1942 Sep
5:30 1:00 +0630 1945 Oct 16 2:00
5:30 - +0530 1996 May 25 0:00
6:30 - +0630 1996 Oct 26 0:30
6:00 - +06 2006 Apr 15 0:30
5:30 - +0530
5:30 - %z 1942 Jan 5
5:30 0:30 %z 1942 Sep
5:30 1:00 %z 1945 Oct 16 2:00
5:30 - %z 1996 May 25 0:00
6:30 - %z 1996 Oct 26 0:30
6:00 - %z 2006 Apr 15 0:30
5:30 - %z
# Syria
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -4016,16 +4044,16 @@ Rule Syria 2009 2022 - Oct lastFri 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Damascus 2:25:12 - LMT 1920 # Dimashq
2:00 Syria EE%sT 2022 Oct 28 0:00
3:00 - +03
3:00 - %z
# Tajikistan
# From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
5:00 - +05 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00s
5:00 1:00 +06 1991 Sep 9 2:00s
5:00 - +05
5:00 - %z 1930 Jun 21
6:00 RussiaAsia %z 1991 Mar 31 2:00s
5:00 1:00 %z 1991 Sep 9 2:00s
5:00 - %z
# Cambodia
# Christmas I
@ -4035,16 +4063,16 @@ Zone Asia/Dushanbe 4:35:12 - LMT 1924 May 2
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Bangkok 6:42:04 - LMT 1880
6:42:04 - BMT 1920 Apr # Bangkok Mean Time
7:00 - +07
7:00 - %z
# Turkmenistan
# From Shanks & Pottenger.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
4:00 - +04 1930 Jun 21
5:00 RussiaAsia +05/+06 1991 Mar 31 2:00
4:00 RussiaAsia +04/+05 1992 Jan 19 2:00
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 RussiaAsia %z 1991 Mar 31 2:00
4:00 RussiaAsia %z 1992 Jan 19 2:00
5:00 - %z
# Oman
# Réunion
@ -4054,25 +4082,25 @@ Zone Asia/Ashgabat 3:53:32 - LMT 1924 May 2 # or Ashkhabad
# The Crozet Is also observe Réunion time; see the 'antarctica' file.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Dubai 3:41:12 - LMT 1920
4:00 - +04
4:00 - %z
# Uzbekistan
# Byalokoz 1919 says Uzbekistan was 4:27:53.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Asia/Samarkand 4:27:53 - LMT 1924 May 2
4:00 - +04 1930 Jun 21
5:00 - +05 1981 Apr 1
5:00 1:00 +06 1981 Oct 1
6:00 - +06 1982 Apr 1
5:00 RussiaAsia +05/+06 1992
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 - %z 1981 Apr 1
5:00 1:00 %z 1981 Oct 1
6:00 - %z 1982 Apr 1
5:00 RussiaAsia %z 1992
5:00 - %z
# Milne says Tashkent was 4:37:10.8.
#STDOFF 4:37:10.8
Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
5:00 - +05 1930 Jun 21
6:00 RussiaAsia +06/+07 1991 Mar 31 2:00
5:00 RussiaAsia +05/+06 1992
5:00 - +05
5:00 - %z 1930 Jun 21
6:00 RussiaAsia %z 1991 Mar 31 2:00
5:00 RussiaAsia %z 1992
5:00 - %z
# Vietnam (southern)
@ -4130,7 +4158,7 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
# Võ Nguyên Giáp, Việt Nam Dân Quốc Công Báo, No. 1 (1945-09-29), page 13
# http://baochi.nlv.gov.vn/baochi/cgi-bin/baochi?a=d&d=JwvzO19450929.2.5&dliv=none
# It says that on 1945-09-01 at 24:00, Vietnam moved back two hours, to +07.
# It also mentions a 1945-03-29 decree (by a Japanese Goveror-General)
# It also mentions a 1945-03-29 decree (by a Japanese Governor-General)
# to set the time zone to +09, but does not say whether that decree
# merely legalized an earlier change to +09.
#
@ -4151,14 +4179,14 @@ Zone Asia/Tashkent 4:37:11 - LMT 1924 May 2
#STDOFF 7:06:30.13
Zone Asia/Ho_Chi_Minh 7:06:30 - LMT 1906 Jul 1
7:06:30 - PLMT 1911 May 1 # Phù Liễn MT
7:00 - +07 1942 Dec 31 23:00
8:00 - +08 1945 Mar 14 23:00
9:00 - +09 1945 Sep 1 24:00
7:00 - +07 1947 Apr 1
8:00 - +08 1955 Jul 1 01:00
7:00 - +07 1959 Dec 31 23:00
8:00 - +08 1975 Jun 13
7:00 - +07
7:00 - %z 1942 Dec 31 23:00
8:00 - %z 1945 Mar 14 23:00
9:00 - %z 1945 Sep 1 24:00
7:00 - %z 1947 Apr 1
8:00 - %z 1955 Jul 1 01:00
7:00 - %z 1959 Dec 31 23:00
8:00 - %z 1975 Jun 13
7:00 - %z
# From Paul Eggert (2019-02-19):
#

View File

@ -66,8 +66,8 @@ Zone Australia/Perth 7:43:24 - LMT 1895 Dec
8:00 Aus AW%sT 1943 Jul
8:00 AW AW%sT
Zone Australia/Eucla 8:35:28 - LMT 1895 Dec
8:45 Aus +0845/+0945 1943 Jul
8:45 AW +0845/+0945
8:45 Aus %z 1943 Jul
8:45 AW %z
# Queensland
#
@ -232,8 +232,8 @@ Rule LH 2008 max - Apr Sun>=1 2:00 0 -
Rule LH 2008 max - Oct Sun>=1 2:00 0:30 -
Zone Australia/Lord_Howe 10:36:20 - LMT 1895 Feb
10:00 - AEST 1981 Mar
10:30 LH +1030/+1130 1985 Jul
10:30 LH +1030/+11
10:30 LH %z 1985 Jul
10:30 LH %z
# Australian miscellany
#
@ -439,16 +439,16 @@ Rule Fiji 2019 only - Nov Sun>=8 2:00 1:00 -
Rule Fiji 2020 only - Dec 20 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fiji 11:55:44 - LMT 1915 Oct 26 # Suva
12:00 Fiji +12/+13
12:00 Fiji %z
# French Polynesia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Gambier -8:59:48 - LMT 1912 Oct 1 # Rikitea
-9:00 - -09
-9:00 - %z
Zone Pacific/Marquesas -9:18:00 - LMT 1912 Oct 1
-9:30 - -0930
-9:30 - %z
Zone Pacific/Tahiti -9:58:16 - LMT 1912 Oct 1 # Papeete
-10:00 - -10
-10:00 - %z
# Clipperton (near North America) is administered from French Polynesia;
# it is uninhabited.
@ -491,7 +491,7 @@ Rule Guam 1977 only - Aug 28 2:00 0 S
Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
9:39:00 - LMT 1901 # Agana
10:00 - GST 1941 Dec 10 # Guam
9:00 - +09 1944 Jul 31
9:00 - %z 1944 Jul 31
10:00 Guam G%sT 2000 Dec 23
10:00 - ChST # Chamorro Standard Time
@ -503,30 +503,30 @@ Zone Pacific/Guam -14:21:00 - LMT 1844 Dec 31
# Wallis & Futuna
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tarawa 11:32:04 - LMT 1901 # Bairiki
12:00 - +12
12:00 - %z
# Kiribati (except Gilbert Is)
# See Pacific/Tarawa for the Gilbert Is.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kanton 0 - -00 1937 Aug 31
-12:00 - -12 1979 Oct
-11:00 - -11 1994 Dec 31
13:00 - +13
-12:00 - %z 1979 Oct
-11:00 - %z 1994 Dec 31
13:00 - %z
Zone Pacific/Kiritimati -10:29:20 - LMT 1901
-10:40 - -1040 1979 Oct
-10:00 - -10 1994 Dec 31
14:00 - +14
-10:40 - %z 1979 Oct
-10:00 - %z 1994 Dec 31
14:00 - %z
# Marshall Is
# See Pacific/Tarawa for most locations.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kwajalein 11:09:20 - LMT 1901
11:00 - +11 1937
10:00 - +10 1941 Apr 1
9:00 - +09 1944 Feb 6
11:00 - +11 1969 Oct
-12:00 - -12 1993 Aug 20 24:00
12:00 - +12
11:00 - %z 1937
10:00 - %z 1941 Apr 1
9:00 - %z 1944 Feb 6
11:00 - %z 1969 Oct
-12:00 - %z 1993 Aug 20 24:00
12:00 - %z
# Micronesia
# For Chuuk and Yap see Pacific/Port_Moresby.
@ -534,22 +534,22 @@ Zone Pacific/Kwajalein 11:09:20 - LMT 1901
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Kosrae -13:08:04 - LMT 1844 Dec 31
10:51:56 - LMT 1901
11:00 - +11 1914 Oct
9:00 - +09 1919 Feb 1
11:00 - +11 1937
10:00 - +10 1941 Apr 1
9:00 - +09 1945 Aug
11:00 - +11 1969 Oct
12:00 - +12 1999
11:00 - +11
11:00 - %z 1914 Oct
9:00 - %z 1919 Feb 1
11:00 - %z 1937
10:00 - %z 1941 Apr 1
9:00 - %z 1945 Aug
11:00 - %z 1969 Oct
12:00 - %z 1999
11:00 - %z
# Nauru
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Nauru 11:07:40 - LMT 1921 Jan 15 # Uaobe
11:30 - +1130 1942 Aug 29
9:00 - +09 1945 Sep 8
11:30 - +1130 1979 Feb 10 2:00
12:00 - +12
11:30 - %z 1942 Aug 29
9:00 - %z 1945 Sep 8
11:30 - %z 1979 Feb 10 2:00
12:00 - %z
# New Caledonia
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -560,7 +560,7 @@ Rule NC 1996 only - Dec 1 2:00s 1:00 -
Rule NC 1997 only - Mar 2 2:00s 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Noumea 11:05:48 - LMT 1912 Jan 13 # Nouméa
11:00 NC +11/+12
11:00 NC %z
###############################################################################
@ -604,8 +604,8 @@ Zone Pacific/Auckland 11:39:04 - LMT 1868 Nov 2
12:00 NZ NZ%sT
Zone Pacific/Chatham 12:13:48 - LMT 1868 Nov 2
12:15 - +1215 1946 Jan 1
12:45 Chatham +1245/+1345
12:15 - %z 1946 Jan 1
12:45 Chatham %z
# Auckland Is
# uninhabited; Māori and Moriori, colonial settlers, pastoralists, sealers,
@ -658,8 +658,8 @@ Rule Cook 1979 1990 - Oct lastSun 0:00 0:30 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
-10:39:04 - LMT 1952 Oct 16
-10:30 - -1030 1978 Nov 12
-10:00 Cook -10/-0930
-10:30 - %z 1978 Nov 12
-10:00 Cook %z
###############################################################################
@ -676,30 +676,30 @@ Zone Pacific/Rarotonga 13:20:56 - LMT 1899 Dec 26 # Avarua
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Niue -11:19:40 - LMT 1952 Oct 16 # Alofi
-11:20 - -1120 1964 Jul
-11:00 - -11
-11:20 - %z 1964 Jul
-11:00 - %z
# Norfolk
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Norfolk 11:11:52 - LMT 1901 # Kingston
11:12 - +1112 1951
11:30 - +1130 1974 Oct 27 02:00s
11:30 1:00 +1230 1975 Mar 2 02:00s
11:30 - +1130 2015 Oct 4 02:00s
11:00 - +11 2019 Jul
11:00 AN +11/+12
11:12 - %z 1951
11:30 - %z 1974 Oct 27 02:00s
11:30 1:00 %z 1975 Mar 2 02:00s
11:30 - %z 2015 Oct 4 02:00s
11:00 - %z 2019 Jul
11:00 AN %z
# Palau (Belau)
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Palau -15:02:04 - LMT 1844 Dec 31 # Koror
8:57:56 - LMT 1901
9:00 - +09
9:00 - %z
# Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
9:48:32 - PMMT 1895 # Port Moresby Mean Time
10:00 - +10
10:00 - %z
#
# From Paul Eggert (2014-10-13):
# Base the Bougainville entry on the Arawa-Kieta region, which appears to have
@ -720,16 +720,16 @@ Zone Pacific/Port_Moresby 9:48:40 - LMT 1880
#
Zone Pacific/Bougainville 10:22:16 - LMT 1880
9:48:32 - PMMT 1895
10:00 - +10 1942 Jul
9:00 - +09 1945 Aug 21
10:00 - +10 2014 Dec 28 2:00
11:00 - +11
10:00 - %z 1942 Jul
9:00 - %z 1945 Aug 21
10:00 - %z 2014 Dec 28 2:00
11:00 - %z
# Pitcairn
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Pitcairn -8:40:20 - LMT 1901 # Adamstown
-8:30 - -0830 1998 Apr 27 0:00
-8:00 - -08
-8:30 - %z 1998 Apr 27 0:00
-8:00 - %z
# American Samoa
# Midway
@ -818,15 +818,15 @@ Rule WS 2012 2020 - Sep lastSun 3:00 1 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Apia 12:33:04 - LMT 1892 Jul 5
-11:26:56 - LMT 1911
-11:30 - -1130 1950
-11:00 WS -11/-10 2011 Dec 29 24:00
13:00 WS +13/+14
-11:30 - %z 1950
-11:00 WS %z 2011 Dec 29 24:00
13:00 WS %z
# Solomon Is
# excludes Bougainville, for which see Papua New Guinea
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
11:00 - +11
11:00 - %z
# Tokelau
#
@ -849,8 +849,8 @@ Zone Pacific/Guadalcanal 10:39:48 - LMT 1912 Oct 1 # Honiara
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Fakaofo -11:24:56 - LMT 1901
-11:00 - -11 2011 Dec 30
13:00 - +13
-11:00 - %z 2011 Dec 30
13:00 - %z
# Tonga
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
@ -862,9 +862,9 @@ Rule Tonga 2016 only - Nov Sun>=1 2:00 1:00 -
Rule Tonga 2017 only - Jan Sun>=15 3:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Tongatapu 12:19:12 - LMT 1945 Sep 10
12:20 - +1220 1961
13:00 - +13 1999
13:00 Tonga +13/+14
12:20 - %z 1961
13:00 - %z 1999
13:00 Tonga %z
# US minor outlying islands
@ -953,7 +953,7 @@ Rule Vanuatu 1992 1993 - Jan Sat>=22 24:00 0 -
Rule Vanuatu 1992 only - Oct Sat>=22 24:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Pacific/Efate 11:13:16 - LMT 1912 Jan 13 # Vila
11:00 Vanuatu +11/+12
11:00 Vanuatu %z
###############################################################################

View File

@ -21,12 +21,13 @@
# or visit www.oracle.com if you need additional information or have any
# questions.
#
# tzdb links for backward compatibility
# Links and zones for backward compatibility
# This file is in the public domain, so clarified as of
# 2009-05-17 by Arthur David Olson.
# This file provides links from old or merged timezone names to current ones.
# It also provides a few zone entries for old naming conventions.
# Many names changed in 1993 and in 1995, and many merged names moved here
# in the period from 2013 through 2022. Several of these names are
# also present in the file 'backzone', which has data important only
@ -67,6 +68,8 @@ Link America/Rio_Branco Brazil/Acre #= America/Porto_Acre
Link America/Noronha Brazil/DeNoronha
Link America/Sao_Paulo Brazil/East
Link America/Manaus Brazil/West
Link Europe/Brussels CET
Link America/Chicago CST6CDT
Link America/Halifax Canada/Atlantic
Link America/Winnipeg Canada/Central
# This line is commented out, as the name exceeded the 14-character limit
@ -81,6 +84,9 @@ Link America/Whitehorse Canada/Yukon
Link America/Santiago Chile/Continental
Link Pacific/Easter Chile/EasterIsland
Link America/Havana Cuba
Link Europe/Athens EET
Link America/Panama EST
Link America/New_York EST5EDT
Link Africa/Cairo Egypt
Link Europe/Dublin Eire
# Vanguard section, for most .zi parsers.
@ -119,6 +125,9 @@ Link America/Jamaica Jamaica
Link Asia/Tokyo Japan
Link Pacific/Kwajalein Kwajalein
Link Africa/Tripoli Libya
Link Europe/Brussels MET
Link America/Phoenix MST
Link America/Denver MST7MDT
Link America/Tijuana Mexico/BajaNorte
Link America/Mazatlan Mexico/BajaSur
Link America/Mexico_City Mexico/General
@ -298,6 +307,7 @@ Link America/Denver America/Shiprock
Link America/Toronto America/Thunder_Bay
Link America/Edmonton America/Yellowknife
Link Pacific/Auckland Antarctica/South_Pole
Link Asia/Ulaanbaatar Asia/Choibalsan
Link Asia/Shanghai Asia/Chongqing
Link Asia/Shanghai Asia/Harbin
Link Asia/Urumqi Asia/Kashgar
@ -312,6 +322,7 @@ Link Europe/Kyiv Europe/Zaporozhye
Link Pacific/Kanton Pacific/Enderbury
Link Pacific/Honolulu Pacific/Johnston
Link Pacific/Port_Moresby Pacific/Yap
Link Europe/Lisbon WET
# Alternate names for the same location
@ -337,5 +348,7 @@ Link Europe/Kyiv Europe/Kiev
# Classically, Cyprus is in Asia; e.g. see Herodotus, Histories, I.72.
# However, for various reasons many users expect to find it under Europe.
Link Asia/Nicosia Europe/Nicosia
Link Pacific/Honolulu HST
Link America/Los_Angeles PST8PDT
Link Pacific/Guadalcanal Pacific/Ponape #= Pacific/Pohnpei
Link Pacific/Port_Moresby Pacific/Truk #= Pacific/Chuuk

View File

@ -28,7 +28,7 @@
# These entries are for uses not otherwise covered by the tz database.
# Their main practical use is for platforms like Android that lack
# support for POSIX.1-2017-style TZ strings. On such platforms these entries
# support for POSIX proleptic TZ strings. On such platforms these entries
# can be useful if the timezone database is wrong or if a ship or
# aircraft at sea is not in a timezone.
@ -74,29 +74,29 @@ Link Etc/GMT GMT
# so we moved the names into the Etc subdirectory.
# Also, the time zone abbreviations are now compatible with %z.
Zone Etc/GMT-14 14 - +14
Zone Etc/GMT-13 13 - +13
Zone Etc/GMT-12 12 - +12
Zone Etc/GMT-11 11 - +11
Zone Etc/GMT-10 10 - +10
Zone Etc/GMT-9 9 - +09
Zone Etc/GMT-8 8 - +08
Zone Etc/GMT-7 7 - +07
Zone Etc/GMT-6 6 - +06
Zone Etc/GMT-5 5 - +05
Zone Etc/GMT-4 4 - +04
Zone Etc/GMT-3 3 - +03
Zone Etc/GMT-2 2 - +02
Zone Etc/GMT-1 1 - +01
Zone Etc/GMT+1 -1 - -01
Zone Etc/GMT+2 -2 - -02
Zone Etc/GMT+3 -3 - -03
Zone Etc/GMT+4 -4 - -04
Zone Etc/GMT+5 -5 - -05
Zone Etc/GMT+6 -6 - -06
Zone Etc/GMT+7 -7 - -07
Zone Etc/GMT+8 -8 - -08
Zone Etc/GMT+9 -9 - -09
Zone Etc/GMT+10 -10 - -10
Zone Etc/GMT+11 -11 - -11
Zone Etc/GMT+12 -12 - -12
Zone Etc/GMT-14 14 - %z
Zone Etc/GMT-13 13 - %z
Zone Etc/GMT-12 12 - %z
Zone Etc/GMT-11 11 - %z
Zone Etc/GMT-10 10 - %z
Zone Etc/GMT-9 9 - %z
Zone Etc/GMT-8 8 - %z
Zone Etc/GMT-7 7 - %z
Zone Etc/GMT-6 6 - %z
Zone Etc/GMT-5 5 - %z
Zone Etc/GMT-4 4 - %z
Zone Etc/GMT-3 3 - %z
Zone Etc/GMT-2 2 - %z
Zone Etc/GMT-1 1 - %z
Zone Etc/GMT+1 -1 - %z
Zone Etc/GMT+2 -2 - %z
Zone Etc/GMT+3 -3 - %z
Zone Etc/GMT+4 -4 - %z
Zone Etc/GMT+5 -5 - %z
Zone Etc/GMT+6 -6 - %z
Zone Etc/GMT+7 -7 - %z
Zone Etc/GMT+8 -8 - %z
Zone Etc/GMT+9 -9 - %z
Zone Etc/GMT+10 -10 - %z
Zone Etc/GMT+11 -11 - %z
Zone Etc/GMT+12 -12 - %z

View File

@ -753,14 +753,6 @@ Rule Russia 1996 2010 - Oct lastSun 2:00s 0 -
# Take "abolishing daylight saving time" to mean that time is now considered
# to be standard.
# These are for backward compatibility with older versions.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone WET 0:00 EU WE%sT
Zone CET 1:00 C-Eur CE%sT
Zone MET 1:00 C-Eur ME%sT
Zone EET 2:00 EU EE%sT
# Previous editions of this database used abbreviations like MET DST
# for Central European Summer Time, but this didn't agree with common usage.
@ -894,7 +886,7 @@ Zone Europe/Minsk 1:50:16 - LMT 1880
3:00 Russia MSK/MSD 1990
3:00 - MSK 1991 Mar 31 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s
3:00 - +03
3:00 - %z
# Belgium
# Luxembourg
@ -1199,22 +1191,22 @@ Rule Thule 2007 max - Nov Sun>=1 2:00 0 S
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Danmarkshavn -1:14:40 - LMT 1916 Jul 28
-3:00 - -03 1980 Apr 6 2:00
-3:00 EU -03/-02 1996
-3:00 - %z 1980 Apr 6 2:00
-3:00 EU %z 1996
0:00 - GMT
#
# Use the old name Scoresbysund, as the current name Ittoqqortoormiit
# exceeds tzdb's 14-letter limit and has no common English abbreviation.
Zone America/Scoresbysund -1:27:52 - LMT 1916 Jul 28 # Ittoqqortoormiit
-2:00 - -02 1980 Apr 6 2:00
-2:00 C-Eur -02/-01 1981 Mar 29
-1:00 EU -01/+00 2024 Mar 31
-2:00 EU -02/-01
-2:00 - %z 1980 Apr 6 2:00
-2:00 C-Eur %z 1981 Mar 29
-1:00 EU %z 2024 Mar 31
-2:00 EU %z
Zone America/Nuuk -3:26:56 - LMT 1916 Jul 28 # Godthåb
-3:00 - -03 1980 Apr 6 2:00
-3:00 EU -03/-02 2023 Mar 26 1:00u
-2:00 - -02 2023 Oct 29 1:00u
-2:00 EU -02/-01
-3:00 - %z 1980 Apr 6 2:00
-3:00 EU %z 2023 Mar 26 1:00u
-2:00 - %z 2023 Oct 29 1:00u
-2:00 EU %z
Zone America/Thule -4:35:08 - LMT 1916 Jul 28 # Pituffik
-4:00 Thule A%sT
@ -2086,10 +2078,39 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# Portugal
# From Paul Eggert (2014-08-11), after a heads-up from Stephen Colebourne:
# According to a Portuguese decree (1911-05-26)
# https://dre.pt/application/dir/pdf1sdip/1911/05/12500/23132313.pdf
# Lisbon was at -0:36:44.68, but switched to GMT on 1912-01-01 at 00:00.
# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07) and Michael
# Deckers (2021-02-10):
# http://oal.ul.pt/documentos/2018/01/hl1911a2018.pdf/
# The Astronomical Observatory of Lisbon has published a list detailing the
# historical transitions in legal time within continental Portugal. It
# directly references many decrees and ordinances which are, in turn,
# referenced below. They can be viewed in the public archives of the Diário da
# República (until 1976-04-09 known as the Diário do Govêrno) at
# https://dre.pt/ (in Portuguese).
#
# Most of the Rules below have been updated simply to match the Observatory's
# listing for continental (mainland) Portugal. Although there are over 50
# referenced decrees and ordinances, only the handful with comments below have
# been verified against the text, typically to provide additional confidence
# wherever dates provided by Whitman and Shanks & Pottenger had disagreed.
# See further below for the Azores and Madeira.
# From Tim Parenti (2024-07-01), per Paul Eggert (2014-08-11), after a
# heads-up from Stephen Colebourne:
# According to a 1911-05-24 Portuguese decree, Lisbon was at -0:36:44.68, but
# switched to GMT on 1912-01-01 at 00:00.
# https://dre.pt/dr/detalhe/decreto/593090
# https://dre.pt/application/conteudo/593090
# The decree made legal time throughout Portugal and her possessions
# "subordinate to the Greenwich meridian, according to the principle adopted at
# the Washington Convention in 1884" and eliminated the "difference of five
# minutes between the internal and external clocks of railway stations".
#
# The decree was gazetted in the 1911-05-30 issue of Diário do Govêrno, and is
# considered to be dated 1911-05-24 by that issue's summary; however, the text
# of the decree itself is dated 1911-05-26. The Diário da República website
# notes the discrepancy, but later laws and the Observatory all seem to refer
# to this decree by the 1911-05-24 date.
#
# From Michael Deckers (2018-02-15):
# article 5 [of the 1911 decree; Deckers's translation] ...:
@ -2097,37 +2118,62 @@ Zone Europe/Warsaw 1:24:00 - LMT 1880
# according to the 2nd article, the civil day January 1, 1912 begins,
# all clocks therefore having to be advanced or set back correspondingly ...
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
#
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
# The new Prime Minister was fed up with getting up in the dark in the winter.
#
# From Paul Eggert (1996-11-12):
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
# at 02:00u, not 01:00u. Assume that these are typos.
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
# Guess that the Azores changed to EU rules in 1992 (since that's when Portugal
# harmonized with EU rules), and that they stayed +0:00 that winter.
#
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
# DSH writes that despite Decree 1,469 (1915), the change to the clocks was not
# done every year, depending on what Spain did, because of railroad schedules.
# Go with Shanks & Pottenger.
# From Tim Parenti (2024-07-01), per Paul Eggert (1999-01-30):
# DSH writes in their history that Decreto 1469 of 1915-03-30 established
# summer time and that, "despite" this, the change to the clocks was not done
# every year, depending on what Spain did, because of railroad schedules.
# In fact, that decree had nothing to do with DST; rather, it regulated the
# sending of time signals. But we do see linkage to Spain in the 1920s below.
# https://dre.pt/dr/detalhe/decreto/1469-1915-285721
# https://dre.pt/application/conteudo/285721
#
# According to the Observatory, standard time was first advanced by Decreto
# 2433 of 1916-06-09 and restored by Decreto 2712 of 1916-10-28. While Whitman
# gives 1916-10-31 for the latter transition, Shanks & Pottenger agrees more
# closely with the decree, which stated that its provision "will start sixty
# minutes after the end of 31 October, according to the current time," i.e.,
# 01:00 on 1 November.
# https://dre.pt/dr/detalhe/decreto/2433-1916-267192
# https://dre.pt/application/conteudo/267192
# https://dre.pt/dr/detalhe/decreto/2712-1916-590937
# https://dre.pt/application/conteudo/590937
Rule Port 1916 only - Jun 17 23:00 1:00 S
# Whitman gives 1916 Oct 31; go with Shanks & Pottenger.
Rule Port 1916 only - Nov 1 1:00 0 -
Rule Port 1917 only - Feb 28 23:00s 1:00 S
Rule Port 1917 1921 - Oct 14 23:00s 0 -
Rule Port 1918 only - Mar 1 23:00s 1:00 S
Rule Port 1919 only - Feb 28 23:00s 1:00 S
Rule Port 1920 only - Feb 29 23:00s 1:00 S
Rule Port 1921 only - Feb 28 23:00s 1:00 S
# From Tim Parenti (2024-07-01):
# Article 7 of Decreto 2922 of 1916-12-30 stated that "the legal time will be
# advanced by sixty minutes from 1 March to 31 October." Per Article 15, this
# came into force from 1917-01-01. Just before the first fall back, Decreto
# 3446 of 1917-10-11 changed the annual end date to 14 October.
# https://dre.pt/dr/detalhe/decreto/2922-1916-261894
# https://dre.pt/application/conteudo/261894
# https://dre.pt/dr/detalhe/decreto/3446-1917-495161
# https://dre.pt/application/conteudo/495161
# This annual change was revoked by Decreto 8038 of 1922-02-18.
# https://dre.pt/dr/detalhe/decreto/8038-1922-569751
# https://dre.pt/application/conteudo/569751
Rule Port 1917 1921 - Mar 1 0:00 1:00 S
Rule Port 1917 1921 - Oct 14 24:00 0 -
# From Tim Parenti (2024-07-01):
# Decreto 9592 of 1924-04-14 noted that "France maintains the advance of legal
# time in the summer and Spain has now adopted it for the first time" and
# considered "that the absence of similar measures would cause serious
# difficulties for international rail connections with consequent repercussions
# on domestic service hours..." along with "inconvenient analogues...for postal
# and telegraph services." Summer time would be in effect from 17 April to 4
# October, with the spring change explicitly specified by bringing clocks
# forward from 16 April 23:00.
# https://dre.pt/dr/detalhe/decreto/9592-1924-652133
# https://dre.pt/application/conteudo/652133
#
# Decreto 10700, issued 1925-04-16, noted that Spain had not continued summer
# time, declared that "the current legal hour prior to 17 April remains
# unchanged from that day forward", and revoked legislation to the contrary,
# just a day before summer time would have otherwise resumed.
# https://dre.pt/dr/detalhe/decreto/10700-1925-437826
# https://dre.pt/application/conteudo/437826
Rule Port 1924 only - Apr 16 23:00s 1:00 S
Rule Port 1924 only - Oct 14 23:00s 0 -
Rule Port 1924 only - Oct 4 23:00s 0 -
Rule Port 1926 only - Apr 17 23:00s 1:00 S
Rule Port 1926 1929 - Oct Sat>=1 23:00s 0 -
Rule Port 1927 only - Apr 9 23:00s 1:00 S
@ -2139,6 +2185,8 @@ Rule Port 1931 1932 - Oct Sat>=1 23:00s 0 -
Rule Port 1932 only - Apr 2 23:00s 1:00 S
Rule Port 1934 only - Apr 7 23:00s 1:00 S
# Whitman gives 1934 Oct 5; go with Shanks & Pottenger.
# Note: The 1935 law specified 10-06 00:00, not 10-05 24:00, but the following
# is equivalent and more succinct.
Rule Port 1934 1938 - Oct Sat>=1 23:00s 0 -
# Shanks & Pottenger give 1935 Apr 30; go with Whitman.
Rule Port 1935 only - Mar 30 23:00s 1:00 S
@ -2149,10 +2197,19 @@ Rule Port 1938 only - Mar 26 23:00s 1:00 S
Rule Port 1939 only - Apr 15 23:00s 1:00 S
# Whitman gives 1939 Oct 7; go with Shanks & Pottenger.
Rule Port 1939 only - Nov 18 23:00s 0 -
# From Tim Parenti (2024-07-01):
# Portaria 9465 of 1940-02-17 advanced clocks from Saturday 1940-02-24 23:00.
# The clocks were restored by Portaria 9658, issued Monday 1940-10-07,
# effective from 24:00 that very night, which agrees with Shanks & Pottenger;
# Whitman gives Saturday 1940-10-05 instead.
# https://dre.pt/dr/detalhe/portaria/9465-1940-189096
# https://dre.pt/application/conteudo/189096
# https://dre.pt/dr/detalhe/portaria/9658-1940-196729
# https://dre.pt/application/conteudo/196729
Rule Port 1940 only - Feb 24 23:00s 1:00 S
# Shanks & Pottenger give 1940 Oct 7; go with Whitman.
Rule Port 1940 1941 - Oct 5 23:00s 0 -
Rule Port 1940 only - Oct 7 23:00s 0 -
Rule Port 1941 only - Apr 5 23:00s 1:00 S
Rule Port 1941 only - Oct 5 23:00s 0 -
Rule Port 1942 1945 - Mar Sat>=8 23:00s 1:00 S
Rule Port 1942 only - Apr 25 22:00s 2:00 M # Midsummer
Rule Port 1942 only - Aug 15 22:00s 1:00 S
@ -2162,66 +2219,195 @@ Rule Port 1943 1945 - Aug Sat>=25 22:00s 1:00 S
Rule Port 1944 1945 - Apr Sat>=21 22:00s 2:00 M
Rule Port 1946 only - Apr Sat>=1 23:00s 1:00 S
Rule Port 1946 only - Oct Sat>=1 23:00s 0 -
# Whitman says DST was not observed in 1950; go with Shanks & Pottenger.
# Whitman gives Oct lastSun for 1952 on; go with Shanks & Pottenger.
Rule Port 1947 1965 - Apr Sun>=1 2:00s 1:00 S
# From Tim Parenti (2024-07-01), per Alois Treindl (2021-02-07):
# The Astronomical Observatory of Lisbon cites Portaria 11767 of 1947-03-28 for
# 1947 and Portaria 12286 of 1948-02-19 for 1948.
# https://dre.pt/dr/detalhe/portaria/11767-1947-414787
# https://dre.pt/application/conteudo/414787
# https://dre.pt/dr/detalhe/portaria/12286-1948-152953
# https://dre.pt/application/conteudo/152953
#
# Although the latter ordinance explicitly had the 1948-10-03 transition
# scheduled for 02:00 rather than 03:00 as had been used in 1947, Decreto-Lei
# 37048 of 1948-09-07 recognized "that it is advisable to definitely set...the
# 'summer time' regime", and fixed the fall transition at 03:00 moving forward.
# https://dre.pt/dr/detalhe/decreto-lei/37048-1948-373810
# https://dre.pt/application/conteudo/373810
# While the Observatory only cites this act for 1949-1965 and not for 1948, it
# does not appear to have had any provision delaying its effect, so assume that
# it overrode the prior ordinance for 1948-10-03.
#
# Whitman says DST was not observed in 1950 and gives Oct lastSun for 1952 on.
# The Observatory, however, agrees with Shanks & Pottenger that 1950 was not an
# exception and that Oct Sun>=1 was maintained through 1965.
Rule Port 1947 1966 - Apr Sun>=1 2:00s 1:00 S
Rule Port 1947 1965 - Oct Sun>=1 2:00s 0 -
Rule Port 1977 only - Mar 27 0:00s 1:00 S
Rule Port 1977 only - Sep 25 0:00s 0 -
Rule Port 1978 1979 - Apr Sun>=1 0:00s 1:00 S
Rule Port 1978 only - Oct 1 0:00s 0 -
Rule Port 1979 1982 - Sep lastSun 1:00s 0 -
Rule Port 1980 only - Mar lastSun 0:00s 1:00 S
Rule Port 1981 1982 - Mar lastSun 1:00s 1:00 S
Rule Port 1983 only - Mar lastSun 2:00s 1:00 S
# From Tim Parenti (2024-07-01):
# Decreto-Lei 47233 of 1966-10-01 considered that the "duality" in time was
# "the cause of serious disturbances" and noted that "the countries with which
# we have the most frequent contacts...have already adopted" a solution
# coinciding with the extant "summer time". It established that the former
# "summer time" would apply year-round on the mainland and adjacent islands
# with immediate effect, as the fall back would have otherwise occurred later
# that evening.
# https://dre.pt/dr/detalhe/decreto-lei/47233-1966-293729
# Model this by changing zones without changing clocks at the
# previously-appointed fall back time.
#
# Decreto-Lei 309/76 of 1976-04-27 acknowledged that those international
# contacts had returned to adopting seasonal times, and considered that the
# year-round advancement "entails considerable sacrifices for the vast majority
# of the working population during the winter months", including morning
# visibility concerns for schoolchildren. It specified, beginning 1976-09-26
# 01:00, an annual return to UT+00 on the mainland from 00:00 UT on Sep lastSun
# to 00:00 UT on Mar lastSun (unless the latter date fell on Easter, in which
# case it was to be brought forward to the preceding Sunday). It also assigned
# the Permanent Time Commission to study and propose revisions for the Azores
# and Madeira, neither of which resumed DST until 1982 (as described further
# below).
# https://dre.pt/dr/detalhe/decreto-lei/309-1976-502063
Rule Port 1976 only - Sep lastSun 1:00 0 -
Rule Port 1977 only - Mar lastSun 0:00s 1:00 S
Rule Port 1977 only - Sep lastSun 0:00s 0 -
# From Tim Parenti (2024-07-01):
# Beginning in 1978, rather than triggering the Easter rule of the 1976 decree
# (Easter fell on 1978-03-26), Article 5 was used instead, which allowed DST
# dates to be changed by order of the Minister of Education and Scientific
# Research, upon consultation with the Permanent Time Commission, "whenever
# considered convenient." As such, a series of one-off ordinances were
# promulgated for the mainland in 1978 through 1980, after which the 1976
# decree naturally came back into force from 1981.
Rule Port 1978 1980 - Apr Sun>=1 1:00s 1:00 S
Rule Port 1978 only - Oct 1 1:00s 0 -
Rule Port 1979 1980 - Sep lastSun 1:00s 0 -
Rule Port 1981 1986 - Mar lastSun 0:00s 1:00 S
Rule Port 1981 1985 - Sep lastSun 0:00s 0 -
# From Tim Parenti (2024-07-01):
# Decreto-Lei 44-B/86 of 1986-03-07 switched mainland Portugal's transition
# times from 0:00s to 1:00u to harmonize with the EEC from 1986-03-30.
# https://dre.pt/dr/detalhe/decreto-lei/44-b-1986-628280
# (Transitions of 1:00s as previously reported and used by the W-Eur rules,
# though equivalent, appear to have been fiction here.) Madeira continued to
# use 0:00s for spring 1986 before joining with the mainland using 1:00u in the
# fall; meanwhile, in the Azores the two were equivalent, so the law specifying
# 0:00s wasn't touched until 1992. (See below for more on the islands.)
#
# From Rui Pedro Salgueiro (1992-11-12):
# Portugal has recently (September, 27) changed timezone
# (from WET to MET or CET) to harmonize with EEC.
#
# Martin Bruckmann (1996-02-29) reports via Peter Ilieve
# that Portugal is reverting to 0:00 by not moving its clocks this spring.
# The new Prime Minister was fed up with getting up in the dark in the winter.
#
# From Paul Eggert (1996-11-12):
# IATA SSIM (1991-09) reports several 1991-09 and 1992-09 transitions
# at 02:00u, not 01:00u. Assume that these are typos.
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
#STDOFF -0:36:44.68
Zone Europe/Lisbon -0:36:45 - LMT 1884
-0:36:45 - LMT 1912 Jan 1 0:00u # Lisbon MT
0:00 Port WE%sT 1966 Apr 3 2:00
0:00 Port WE%sT 1966 Oct 2 2:00s
1:00 - CET 1976 Sep 26 1:00
0:00 Port WE%sT 1983 Sep 25 1:00s
0:00 W-Eur WE%sT 1992 Sep 27 1:00s
0:00 Port WE%sT 1986
0:00 EU WE%sT 1992 Sep 27 1:00u
1:00 EU CE%sT 1996 Mar 31 1:00u
0:00 EU WE%sT
# From Tim Parenti (2024-07-01):
# For the Azores and Madeira, legislation was followed from the laws currently
# in force as listed at:
# https://oal.ul.pt/hora-legal/legislacao/
# working backward through references of revocation and abrogation to
# Decreto-Lei 47233 of 1966-10-01, the last time DST was abolished across the
# mainland and its adjacent islands. Because of that reference, it is
# therefore assumed that DST rules in the islands prior to 1966 were like that
# of the mainland, though most legislation of the time didn't explicitly
# specify DST practices for the islands.
Zone Atlantic/Azores -1:42:40 - LMT 1884 # Ponta Delgada
-1:54:32 - HMT 1912 Jan 1 2:00u # Horta MT
# Vanguard section, for zic and other parsers that support %z.
# -2:00 Port %z 1966 Apr 3 2:00
# -1:00 Port %z 1983 Sep 25 1:00s
# -1:00 W-Eur %z 1992 Sep 27 1:00s
-2:00 Port %z 1966 Oct 2 2:00s
# From Tim Parenti (2024-07-01):
# While Decreto-Lei 309/76 of 1976-04-27 reintroduced DST on the mainland by
# falling back on 1976-09-26, it assigned the Permanent Time Commission to
# study and propose revisions for the Azores and Madeira. Decreto Regional
# 9/77/A of 1977-05-17 affirmed that "the legal time remained unchanged in the
# Azores" at UT-1, and would remain there year-round.
# https://dre.pt/dr/detalhe/decreto-regional/9-1977-252066
#
# Decreto Regional 2/82/A, published 1982-03-02, adopted DST in the same
# fashion as the mainland used at the time.
# https://dre.pt/dr/detalhe/decreto-regional/2-1982-599965
# Though transitions in the Azores officially remained at 0:00s through 1992,
# this was equivalent to the EU-style 1:00u adopted by the mainland in 1986, so
# model it as such.
-1:00 - %z 1982 Mar 28 0:00s
-1:00 Port %z 1986
# Rearguard section, for parsers lacking %z; see ziguard.awk.
-2:00 Port -02/-01 1942 Apr 25 22:00s
-2:00 Port +00 1942 Aug 15 22:00s
-2:00 Port -02/-01 1943 Apr 17 22:00s
-2:00 Port +00 1943 Aug 28 22:00s
-2:00 Port -02/-01 1944 Apr 22 22:00s
-2:00 Port +00 1944 Aug 26 22:00s
-2:00 Port -02/-01 1945 Apr 21 22:00s
-2:00 Port +00 1945 Aug 25 22:00s
-2:00 Port -02/-01 1966 Apr 3 2:00
-1:00 Port -01/+00 1983 Sep 25 1:00s
-1:00 W-Eur -01/+00 1992 Sep 27 1:00s
# -2:00 Port -02/-01 1942 Apr 25 22:00s
# -2:00 Port +00 1942 Aug 15 22:00s
# -2:00 Port -02/-01 1943 Apr 17 22:00s
# -2:00 Port +00 1943 Aug 28 22:00s
# -2:00 Port -02/-01 1944 Apr 22 22:00s
# -2:00 Port +00 1944 Aug 26 22:00s
# -2:00 Port -02/-01 1945 Apr 21 22:00s
# -2:00 Port +00 1945 Aug 25 22:00s
# -2:00 Port -02/-01 1966 Oct 2 2:00s
# -1:00 - -01 1982 Mar 28 0:00s
# -1:00 Port -01/+00 1986
# End of rearguard section.
0:00 EU WE%sT 1993 Mar 28 1:00u
-1:00 EU -01/+00
#
# From Paul Eggert (1996-11-12):
# IATA SSIM (1991/1992) reports that the Azores were at -1:00.
# IATA SSIM (1993-02) says +0:00; later issues (through 1996-09) say -1:00.
#
# From Tim Parenti (2024-07-01):
# After mainland Portugal had shifted forward an hour from 1992-09-27, Decreto
# Legislativo Regional 29/92/A of 1992-12-23 sought to "reduce the time
# difference" by shifting the Azores forward as well from 1992-12-27. Just six
# months later, this was revoked by Decreto Legislativo Regional 9/93/A, citing
# "major changes in work habits and way of life." Though the revocation didn't
# give a transition time, it was signed Wednesday 1993-06-16; assume it took
# effect later that evening, and that an EU-style spring forward (to +01) was
# still observed in the interim on 1993-03-28.
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/29-1992-621553
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/9-1993-389633
-1:00 EU %z 1992 Dec 27 1:00s
0:00 EU WE%sT 1993 Jun 17 1:00u
-1:00 EU %z
Zone Atlantic/Madeira -1:07:36 - LMT 1884 # Funchal
-1:07:36 - FMT 1912 Jan 1 1:00u # Funchal MT
# Vanguard section, for zic and other parsers that support %z.
# -1:00 Port %z 1966 Apr 3 2:00
-1:00 Port %z 1966 Oct 2 2:00s
# Rearguard section, for parsers lacking %z; see ziguard.awk.
-1:00 Port -01/+00 1942 Apr 25 22:00s
-1:00 Port +01 1942 Aug 15 22:00s
-1:00 Port -01/+00 1943 Apr 17 22:00s
-1:00 Port +01 1943 Aug 28 22:00s
-1:00 Port -01/+00 1944 Apr 22 22:00s
-1:00 Port +01 1944 Aug 26 22:00s
-1:00 Port -01/+00 1945 Apr 21 22:00s
-1:00 Port +01 1945 Aug 25 22:00s
-1:00 Port -01/+00 1966 Apr 3 2:00
# -1:00 Port -01/+00 1942 Apr 25 22:00s
# -1:00 Port +01 1942 Aug 15 22:00s
# -1:00 Port -01/+00 1943 Apr 17 22:00s
# -1:00 Port +01 1943 Aug 28 22:00s
# -1:00 Port -01/+00 1944 Apr 22 22:00s
# -1:00 Port +01 1944 Aug 26 22:00s
# -1:00 Port -01/+00 1945 Apr 21 22:00s
# -1:00 Port +01 1945 Aug 25 22:00s
# -1:00 Port -01/+00 1966 Oct 2 2:00s
# End of rearguard section.
0:00 Port WE%sT 1983 Sep 25 1:00s
#
# From Tim Parenti (2024-07-01):
# Decreto Regional 5/82/M, published 1982-04-03, established DST transitions at
# 0:00u, which for Madeira is equivalent to the mainland's rules (0:00s) at the
# time. It came into effect the day following its publication, Sunday
# 1982-04-04, thus resuming Madeira's DST practice about a week later than the
# mainland and the Azores.
# https://dre.pt/dr/detalhe/decreto-regional/5-1982-608273
#
# Decreto Legislativo Regional 18/86/M, published 1986-10-01, adopted EU-style
# rules (1:00u) and entered into immediate force after being signed on
# 1986-07-31.
# https://dre.pt/dr/detalhe/decreto-legislativo-regional/18-1986-221705
0:00 - WET 1982 Apr 4
0:00 Port WE%sT 1986 Jul 31
0:00 EU WE%sT
# Romania
@ -2433,7 +2619,7 @@ Zone Europe/Kaliningrad 1:22:00 - LMT 1893 Apr
2:00 Poland EE%sT 1946 Apr 7
3:00 Russia MSK/MSD 1989 Mar 26 2:00s
2:00 Russia EE%sT 2011 Mar 27 2:00s
3:00 - +03 2014 Oct 26 2:00s
3:00 - %z 2014 Oct 26 2:00s
2:00 - EET
@ -2683,14 +2869,14 @@ Zone Europe/Simferopol 2:16:24 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201602150056
Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
3:00 - +03 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s
3:00 - +03 2016 Mar 27 2:00s
4:00 - +04
3:00 - %z 1930 Jun 21
4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia %z 1991 Mar 31 2:00s
4:00 - %z 1992 Mar 29 2:00s
3:00 Russia %z 2011 Mar 27 2:00s
4:00 - %z 2014 Oct 26 2:00s
3:00 - %z 2016 Mar 27 2:00s
4:00 - %z
# From Paul Eggert (2016-11-11):
# Europe/Volgograd covers:
@ -2720,15 +2906,15 @@ Zone Europe/Astrakhan 3:12:12 - LMT 1924 May
# http://publication.pravo.gov.ru/Document/View/0001202012220002
Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
3:00 - +03 1930 Jun 21
4:00 - +04 1961 Nov 11
4:00 Russia +04/+05 1988 Mar 27 2:00s
3:00 - %z 1930 Jun 21
4:00 - %z 1961 Nov 11
4:00 Russia %z 1988 Mar 27 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s
4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK 2018 Oct 28 2:00s
4:00 - +04 2020 Dec 27 2:00s
4:00 - %z 2020 Dec 27 2:00s
3:00 - MSK
# From Paul Eggert (2016-11-11):
@ -2743,14 +2929,14 @@ Zone Europe/Volgograd 2:57:40 - LMT 1920 Jan 3
# http://publication.pravo.gov.ru/Document/View/0001201611220031
Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21
4:00 Russia +04/+05 1988 Mar 27 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s
3:00 - +03 2016 Dec 4 2:00s
4:00 - +04
3:00 - %z 1930 Jun 21
4:00 Russia %z 1988 Mar 27 2:00s
3:00 Russia %z 1991 Mar 31 2:00s
4:00 - %z 1992 Mar 29 2:00s
3:00 Russia %z 2011 Mar 27 2:00s
4:00 - %z 2014 Oct 26 2:00s
3:00 - %z 2016 Dec 4 2:00s
4:00 - %z
# From Paul Eggert (2016-03-18):
# Europe/Kirov covers:
@ -2758,10 +2944,10 @@ Zone Europe/Saratov 3:04:18 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14).
#
Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s
3:00 - %z 1930 Jun 21
4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia MSK/MSD 1991 Mar 31 2:00s
4:00 - +04 1992 Mar 29 2:00s
4:00 - %z 1992 Mar 29 2:00s
3:00 Russia MSK/MSD 2011 Mar 27 2:00s
4:00 - MSK 2014 Oct 26 2:00s
3:00 - MSK
@ -2776,15 +2962,15 @@ Zone Europe/Kirov 3:18:48 - LMT 1919 Jul 1 0:00u
# The 1989 transition is from USSR act No. 227 (1989-03-14).
Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21
4:00 - +04 1935 Jan 27
4:00 Russia +04/+05 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s
2:00 Russia +02/+03 1991 Sep 29 2:00s
3:00 - +03 1991 Oct 20 3:00
4:00 Russia +04/+05 2010 Mar 28 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s
4:00 - +04
3:00 - %z 1930 Jun 21
4:00 - %z 1935 Jan 27
4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia %z 1991 Mar 31 2:00s
2:00 Russia %z 1991 Sep 29 2:00s
3:00 - %z 1991 Oct 20 3:00
4:00 Russia %z 2010 Mar 28 2:00s
3:00 Russia %z 2011 Mar 27 2:00s
4:00 - %z
# From Paul Eggert (2016-03-18):
# Europe/Ulyanovsk covers:
@ -2800,14 +2986,14 @@ Zone Europe/Samara 3:20:20 - LMT 1919 Jul 1 0:00u
# http://publication.pravo.gov.ru/Document/View/0001201603090051
Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
3:00 - +03 1930 Jun 21
4:00 Russia +04/+05 1989 Mar 26 2:00s
3:00 Russia +03/+04 1991 Mar 31 2:00s
2:00 Russia +02/+03 1992 Jan 19 2:00s
3:00 Russia +03/+04 2011 Mar 27 2:00s
4:00 - +04 2014 Oct 26 2:00s
3:00 - +03 2016 Mar 27 2:00s
4:00 - +04
3:00 - %z 1930 Jun 21
4:00 Russia %z 1989 Mar 26 2:00s
3:00 Russia %z 1991 Mar 31 2:00s
2:00 Russia %z 1992 Jan 19 2:00s
3:00 Russia %z 2011 Mar 27 2:00s
4:00 - %z 2014 Oct 26 2:00s
3:00 - %z 2016 Mar 27 2:00s
4:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Yekaterinburg covers...
@ -2832,12 +3018,12 @@ Zone Europe/Ulyanovsk 3:13:36 - LMT 1919 Jul 1 0:00u
#STDOFF 4:02:32.9
Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
3:45:05 - PMT 1919 Jul 15 4:00
4:00 - +04 1930 Jun 21
5:00 Russia +05/+06 1991 Mar 31 2:00s
4:00 Russia +04/+05 1992 Jan 19 2:00s
5:00 Russia +05/+06 2011 Mar 27 2:00s
6:00 - +06 2014 Oct 26 2:00s
5:00 - +05
4:00 - %z 1930 Jun 21
5:00 Russia %z 1991 Mar 31 2:00s
4:00 Russia %z 1992 Jan 19 2:00s
5:00 Russia %z 2011 Mar 27 2:00s
6:00 - %z 2014 Oct 26 2:00s
5:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -2847,12 +3033,12 @@ Zone Asia/Yekaterinburg 4:02:33 - LMT 1916 Jul 3
# Byalokoz 1919 says Omsk was 4:53:30.
Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
5:00 - +05 1930 Jun 21
6:00 Russia +06/+07 1991 Mar 31 2:00s
5:00 Russia +05/+06 1992 Jan 19 2:00s
6:00 Russia +06/+07 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s
6:00 - +06
5:00 - %z 1930 Jun 21
6:00 Russia %z 1991 Mar 31 2:00s
5:00 Russia %z 1992 Jan 19 2:00s
6:00 Russia %z 2011 Mar 27 2:00s
7:00 - %z 2014 Oct 26 2:00s
6:00 - %z
# From Paul Eggert (2016-02-22):
# Asia/Barnaul covers:
@ -2885,14 +3071,14 @@ Zone Asia/Omsk 4:53:30 - LMT 1919 Nov 14
# http://publication.pravo.gov.ru/Document/View/0001201603090038
Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
6:00 - +06 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s
7:00 Russia +07/+08 1995 May 28
6:00 Russia +06/+07 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s
6:00 - +06 2016 Mar 27 2:00s
7:00 - +07
6:00 - %z 1930 Jun 21
7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia %z 1995 May 28
6:00 Russia %z 2011 Mar 27 2:00s
7:00 - %z 2014 Oct 26 2:00s
6:00 - %z 2016 Mar 27 2:00s
7:00 - %z
# From Paul Eggert (2016-03-18):
# Asia/Novosibirsk covers:
@ -2906,14 +3092,14 @@ Zone Asia/Barnaul 5:35:00 - LMT 1919 Dec 10
# http://publication.pravo.gov.ru/Document/View/0001201607040064
Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
6:00 - +06 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s
7:00 Russia +07/+08 1993 May 23 # say Shanks & P.
6:00 Russia +06/+07 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s
6:00 - +06 2016 Jul 24 2:00s
7:00 - +07
6:00 - %z 1930 Jun 21
7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia %z 1993 May 23 # say Shanks & P.
6:00 Russia %z 2011 Mar 27 2:00s
7:00 - %z 2014 Oct 26 2:00s
6:00 - %z 2016 Jul 24 2:00s
7:00 - %z
# From Paul Eggert (2016-03-18):
# Asia/Tomsk covers:
@ -2958,14 +3144,14 @@ Zone Asia/Novosibirsk 5:31:40 - LMT 1919 Dec 14 6:00
# http://publication.pravo.gov.ru/Document/View/0001201604260048
Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
6:00 - +06 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s
7:00 Russia +07/+08 2002 May 1 3:00
6:00 Russia +06/+07 2011 Mar 27 2:00s
7:00 - +07 2014 Oct 26 2:00s
6:00 - +06 2016 May 29 2:00s
7:00 - +07
6:00 - %z 1930 Jun 21
7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia %z 2002 May 1 3:00
6:00 Russia %z 2011 Mar 27 2:00s
7:00 - %z 2014 Oct 26 2:00s
6:00 - %z 2016 May 29 2:00s
7:00 - %z
# From Tim Parenti (2014-07-03):
@ -2996,12 +3182,12 @@ Zone Asia/Tomsk 5:39:51 - LMT 1919 Dec 22
# realigning itself with KRAT.
Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
6:00 - +06 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s
7:00 Russia +07/+08 2010 Mar 28 2:00s
6:00 Russia +06/+07 2011 Mar 27 2:00s
7:00 - +07
6:00 - %z 1930 Jun 21
7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia %z 2010 Mar 28 2:00s
6:00 Russia %z 2011 Mar 27 2:00s
7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
# Asia/Krasnoyarsk covers...
@ -3015,12 +3201,12 @@ Zone Asia/Novokuznetsk 5:48:48 - LMT 1924 May 1
# Byalokoz 1919 says Krasnoyarsk was 6:11:26.
Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
6:00 - +06 1930 Jun 21
7:00 Russia +07/+08 1991 Mar 31 2:00s
6:00 Russia +06/+07 1992 Jan 19 2:00s
7:00 Russia +07/+08 2011 Mar 27 2:00s
8:00 - +08 2014 Oct 26 2:00s
7:00 - +07
6:00 - %z 1930 Jun 21
7:00 Russia %z 1991 Mar 31 2:00s
6:00 Russia %z 1992 Jan 19 2:00s
7:00 Russia %z 2011 Mar 27 2:00s
8:00 - %z 2014 Oct 26 2:00s
7:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -3037,12 +3223,12 @@ Zone Asia/Krasnoyarsk 6:11:26 - LMT 1920 Jan 6
Zone Asia/Irkutsk 6:57:05 - LMT 1880
6:57:05 - IMT 1920 Jan 25 # Irkutsk Mean Time
7:00 - +07 1930 Jun 21
8:00 Russia +08/+09 1991 Mar 31 2:00s
7:00 Russia +07/+08 1992 Jan 19 2:00s
8:00 Russia +08/+09 2011 Mar 27 2:00s
9:00 - +09 2014 Oct 26 2:00s
8:00 - +08
7:00 - %z 1930 Jun 21
8:00 Russia %z 1991 Mar 31 2:00s
7:00 Russia %z 1992 Jan 19 2:00s
8:00 Russia %z 2011 Mar 27 2:00s
9:00 - %z 2014 Oct 26 2:00s
8:00 - %z
# From Tim Parenti (2014-07-06):
@ -3059,13 +3245,13 @@ Zone Asia/Irkutsk 6:57:05 - LMT 1880
# http://publication.pravo.gov.ru/Document/View/0001201512300107
Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s
9:00 Russia +09/+10 2011 Mar 27 2:00s
10:00 - +10 2014 Oct 26 2:00s
8:00 - +08 2016 Mar 27 2:00
9:00 - +09
8:00 - %z 1930 Jun 21
9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia %z 2011 Mar 27 2:00s
10:00 - %z 2014 Oct 26 2:00s
8:00 - %z 2016 Mar 27 2:00
9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3105,12 +3291,12 @@ Zone Asia/Chita 7:33:52 - LMT 1919 Dec 15
# Byalokoz 1919 says Yakutsk was 8:38:58.
Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s
9:00 Russia +09/+10 2011 Mar 27 2:00s
10:00 - +10 2014 Oct 26 2:00s
9:00 - +09
8:00 - %z 1930 Jun 21
9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia %z 2011 Mar 27 2:00s
10:00 - %z 2014 Oct 26 2:00s
9:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3128,12 +3314,12 @@ Zone Asia/Yakutsk 8:38:58 - LMT 1919 Dec 15
# Go with Byalokoz.
Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
9:00 - +09 1930 Jun 21
10:00 Russia +10/+11 1991 Mar 31 2:00s
9:00 Russia +09/+10 1992 Jan 19 2:00s
10:00 Russia +10/+11 2011 Mar 27 2:00s
11:00 - +11 2014 Oct 26 2:00s
10:00 - +10
9:00 - %z 1930 Jun 21
10:00 Russia %z 1991 Mar 31 2:00s
9:00 Russia %z 1992 Jan 19 2:00s
10:00 Russia %z 2011 Mar 27 2:00s
11:00 - %z 2014 Oct 26 2:00s
10:00 - %z
# From Tim Parenti (2014-07-03):
@ -3151,14 +3337,14 @@ Zone Asia/Vladivostok 8:47:31 - LMT 1922 Nov 15
# This transition is no doubt wrong, but we have no better info.
Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21
9:00 Russia +09/+10 1991 Mar 31 2:00s
8:00 Russia +08/+09 1992 Jan 19 2:00s
9:00 Russia +09/+10 2004
10:00 Russia +10/+11 2011 Mar 27 2:00s
11:00 - +11 2011 Sep 13 0:00s # Decree 725?
10:00 - +10 2014 Oct 26 2:00s
9:00 - +09
8:00 - %z 1930 Jun 21
9:00 Russia %z 1991 Mar 31 2:00s
8:00 Russia %z 1992 Jan 19 2:00s
9:00 Russia %z 2004
10:00 Russia %z 2011 Mar 27 2:00s
11:00 - %z 2011 Sep 13 0:00s # Decree 725?
10:00 - %z 2014 Oct 26 2:00s
9:00 - %z
# From Tim Parenti (2014-07-03):
@ -3174,14 +3360,14 @@ Zone Asia/Khandyga 9:02:13 - LMT 1919 Dec 15
# The Zone name should be Asia/Yuzhno-Sakhalinsk, but that's too long.
Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
9:00 - +09 1945 Aug 25
11:00 Russia +11/+12 1991 Mar 31 2:00s # Sakhalin T
10:00 Russia +10/+11 1992 Jan 19 2:00s
11:00 Russia +11/+12 1997 Mar lastSun 2:00s
10:00 Russia +10/+11 2011 Mar 27 2:00s
11:00 - +11 2014 Oct 26 2:00s
10:00 - +10 2016 Mar 27 2:00s
11:00 - +11
9:00 - %z 1945 Aug 25
11:00 Russia %z 1991 Mar 31 2:00s # Sakhalin T
10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia %z 1997 Mar lastSun 2:00s
10:00 Russia %z 2011 Mar 27 2:00s
11:00 - %z 2014 Oct 26 2:00s
10:00 - %z 2016 Mar 27 2:00s
11:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2009-11-29):
@ -3204,13 +3390,13 @@ Zone Asia/Sakhalin 9:30:48 - LMT 1905 Aug 23
# http://publication.pravo.gov.ru/Document/View/0001201604050038
Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
10:00 - +10 1930 Jun 21 # Magadan Time
11:00 Russia +11/+12 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s
12:00 - +12 2014 Oct 26 2:00s
10:00 - +10 2016 Apr 24 2:00s
11:00 - +11
10:00 - %z 1930 Jun 21 # Magadan Time
11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia %z 2011 Mar 27 2:00s
12:00 - %z 2014 Oct 26 2:00s
10:00 - %z 2016 Apr 24 2:00s
11:00 - %z
# From Tim Parenti (2014-07-06):
@ -3255,12 +3441,12 @@ Zone Asia/Magadan 10:03:12 - LMT 1924 May 2
# Go with Srednekolymsk.
Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
10:00 - +10 1930 Jun 21
11:00 Russia +11/+12 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s
12:00 - +12 2014 Oct 26 2:00s
11:00 - +11
10:00 - %z 1930 Jun 21
11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia %z 2011 Mar 27 2:00s
12:00 - %z 2014 Oct 26 2:00s
11:00 - %z
# From Tim Parenti (2014-07-03):
@ -3278,14 +3464,14 @@ Zone Asia/Srednekolymsk 10:14:52 - LMT 1924 May 2
# UTC+12 since at least then, too.
Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
8:00 - +08 1930 Jun 21
9:00 Russia +09/+10 1981 Apr 1
11:00 Russia +11/+12 1991 Mar 31 2:00s
10:00 Russia +10/+11 1992 Jan 19 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s
12:00 - +12 2011 Sep 13 0:00s # Decree 725?
11:00 - +11 2014 Oct 26 2:00s
10:00 - +10
8:00 - %z 1930 Jun 21
9:00 Russia %z 1981 Apr 1
11:00 Russia %z 1991 Mar 31 2:00s
10:00 Russia %z 1992 Jan 19 2:00s
11:00 Russia %z 2011 Mar 27 2:00s
12:00 - %z 2011 Sep 13 0:00s # Decree 725?
11:00 - %z 2014 Oct 26 2:00s
10:00 - %z
# From Tim Parenti (2014-07-03), per Oscar van Vlijmen (2001-08-25):
@ -3298,12 +3484,12 @@ Zone Asia/Ust-Nera 9:32:54 - LMT 1919 Dec 15
# The Zone name should be Asia/Petropavlovsk-Kamchatski or perhaps
# Asia/Petropavlovsk-Kamchatsky, but these are too long.
Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
11:00 - +11 1930 Jun 21
12:00 Russia +12/+13 1991 Mar 31 2:00s
11:00 Russia +11/+12 1992 Jan 19 2:00s
12:00 Russia +12/+13 2010 Mar 28 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s
12:00 - +12
11:00 - %z 1930 Jun 21
12:00 Russia %z 1991 Mar 31 2:00s
11:00 Russia %z 1992 Jan 19 2:00s
12:00 Russia %z 2010 Mar 28 2:00s
11:00 Russia %z 2011 Mar 27 2:00s
12:00 - %z
# From Tim Parenti (2014-07-03):
@ -3311,13 +3497,13 @@ Zone Asia/Kamchatka 10:34:36 - LMT 1922 Nov 10
# 87 RU-CHU Chukotka Autonomous Okrug
Zone Asia/Anadyr 11:49:56 - LMT 1924 May 2
12:00 - +12 1930 Jun 21
13:00 Russia +13/+14 1982 Apr 1 0:00s
12:00 Russia +12/+13 1991 Mar 31 2:00s
11:00 Russia +11/+12 1992 Jan 19 2:00s
12:00 Russia +12/+13 2010 Mar 28 2:00s
11:00 Russia +11/+12 2011 Mar 27 2:00s
12:00 - +12
12:00 - %z 1930 Jun 21
13:00 Russia %z 1982 Apr 1 0:00s
12:00 Russia %z 1991 Mar 31 2:00s
11:00 Russia %z 1992 Jan 19 2:00s
12:00 Russia %z 2010 Mar 28 2:00s
11:00 Russia %z 2011 Mar 27 2:00s
12:00 - %z
# Bosnia & Herzegovina
# Croatia
@ -3436,7 +3622,7 @@ Zone Africa/Ceuta -0:21:16 - LMT 1901 Jan 1 0:00u
1:00 - CET 1986
1:00 EU CE%sT
Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
-1:00 - -01 1946 Sep 30 1:00
-1:00 - %z 1946 Sep 30 1:00
0:00 - WET 1980 Apr 6 0:00s
0:00 1:00 WEST 1980 Sep 28 1:00u
0:00 EU WE%sT
@ -3517,8 +3703,8 @@ Zone Atlantic/Canary -1:01:36 - LMT 1922 Mar # Las Palmas de Gran C.
# but if no one is present after 11 at night, could be postponed until one
# hour before the beginning of service.
# From Paul Eggert (2013-09-11):
# Round BMT to the nearest even second, 0:29:46.
# From Paul Eggert (2024-05-24):
# Express BMT as 0:29:45.500, approximately the same precision 7° 26' 22.50".
#
# We can find no reliable source for Shanks's assertion that all of Switzerland
# except Geneva switched to Bern Mean Time at 00:00 on 1848-09-12. This book:
@ -3557,6 +3743,7 @@ Rule Swiss 1941 1942 - May Mon>=1 1:00 1:00 S
Rule Swiss 1941 1942 - Oct Mon>=1 2:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Europe/Zurich 0:34:08 - LMT 1853 Jul 16 # See above comment.
#STDOFF 0:29:45.500
0:29:46 - BMT 1894 Jun # Bern Mean Time
1:00 Swiss CE%sT 1981
1:00 EU CE%sT
@ -3754,7 +3941,7 @@ Rule Turkey 1996 2006 - Oct lastSun 1:00s 0 -
Zone Europe/Istanbul 1:55:52 - LMT 1880
1:56:56 - IMT 1910 Oct # Istanbul Mean Time?
2:00 Turkey EE%sT 1978 Jun 29
3:00 Turkey +03/+04 1984 Nov 1 2:00
3:00 Turkey %z 1984 Nov 1 2:00
2:00 Turkey EE%sT 2007
2:00 EU EE%sT 2011 Mar 27 1:00u
2:00 - EET 2011 Mar 28 1:00u
@ -3763,7 +3950,7 @@ Zone Europe/Istanbul 1:55:52 - LMT 1880
2:00 EU EE%sT 2015 Oct 25 1:00u
2:00 1:00 EEST 2015 Nov 8 1:00u
2:00 EU EE%sT 2016 Sep 7
3:00 - +03
3:00 - %z
# Ukraine
#

View File

@ -92,11 +92,11 @@ Leap 2016 Dec 31 23:59:60 + S
# Any additional leap seconds will come after this.
# This Expires line is commented out for now,
# so that pre-2020a zic implementations do not reject this file.
#Expires 2024 Dec 28 00:00:00
#Expires 2025 Jun 28 00:00:00
# POSIX timestamps for the data in this file:
#updated 1704708379 (2024-01-08 10:06:19 UTC)
#expires 1735344000 (2024-12-28 00:00:00 UTC)
#updated 1720104763 (2024-07-04 14:52:43 UTC)
#expires 1751068800 (2025-06-28 00:00:00 UTC)
# Updated through IERS Bulletin C (https://hpiers.obspm.fr/iers/bul/bulc/bulletinc.dat)
# File expires on 28 December 2024
# File expires on 28 June 2025

View File

@ -208,26 +208,6 @@ Rule US 1987 2006 - Apr Sun>=1 2:00 1:00 D
Rule US 2007 max - Mar Sun>=8 2:00 1:00 D
Rule US 2007 max - Nov Sun>=1 2:00 0 S
# From Arthur David Olson, 2005-12-19
# We generate the files specified below to guard against old files with
# obsolete information being left in the time zone binary directory.
# We limit the list to names that have appeared in previous versions of
# this time zone package.
# We do these as separate Zones rather than as Links to avoid problems if
# a particular place changes whether it observes DST.
# We put these specifications here in the northamerica file both to
# increase the chances that they'll actually get compiled and to
# avoid the need to duplicate the US rules in another file.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone EST -5:00 - EST
Zone MST -7:00 - MST
Zone HST -10:00 - HST
Zone EST5EDT -5:00 US E%sT
Zone CST6CDT -6:00 US C%sT
Zone MST7MDT -7:00 US M%sT
Zone PST8PDT -8:00 US P%sT
# From U. S. Naval Observatory (1989-01-19):
# USA EASTERN 5 H BEHIND UTC NEW YORK, WASHINGTON
# USA EASTERN 4 H BEHIND UTC APR 3 - OCT 30
@ -2396,6 +2376,81 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# the researchers who prepared the Decrees page failed to find some of
# the relevant documents.
# From Heitor David Pinto (2024-08-04):
# In 1931, the decree implementing DST specified that it would take
# effect on 30 April....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192270&pagina=2&seccion=1
#
# In 1981, the decree changing Campeche, Yucatán and Quintana Roo to UTC-5
# specified that it would enter into force on 26 December 1981 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4705667&fecha=23/12/1981&cod_diario=202796
#
# In 1982, the decree returning Campeche and Yucatán to UTC-6 specified that
# it would enter into force on 2 November 1982 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=205689&pagina=3&seccion=0
#
# Quintana Roo changed to UTC-6 on 4 January 1983 at 0:00, and again
# to UTC-5 on 26 October 1997 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4787355&fecha=28/12/1982&cod_diario=206112
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=209559&pagina=15&seccion=0
#
# Durango, Coahuila, Nuevo León and Tamaulipas were set to UTC-7 on 1 January
# 1922, and changed to UTC-6 on 10 June 1927. Then Durango, Coahuila and
# Nuevo León (but not Tamaulipas) returned to UTC-7 on 15 November 1930,
# observed DST in 1931, and changed again to UTC-6 on 1 April 1932....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4441846&fecha=29/12/1921&cod_diario=187468
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4491963&fecha=15/11/1930&cod_diario=190835
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4418437&fecha=21/01/1932&cod_diario=185588
#
# ... the ... 10 June 1927 ... decree only said 10 June 1927, without
# specifying a time, so I suppose that it should be considered at 0:00.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4541520&fecha=09/06/1927&cod_diario=193920
#
# In 1942, the decree changing Baja California, Baja California Sur, Sonora,
# Sinaloa and Nayarit to UTC-7 was published on 24 April, but it said that it
# would apply from 1 April, so it's unclear when the change actually
# occurred. The database currently shows 24 April 1942.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=192203&pagina=2&seccion=1
#
# Baja California Sur, Sonora, Sinaloa and Nayarit never used UTC-8. The ...
# 14 January 1949 ... change [to UTC-8] only occurred in Baja California.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
#
# In 1945, the decree changing Baja California to UTC-8 specified that it
# would take effect on the third day from its publication.
# It was published on 12 November, so it would take effect on 15 November....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4555049&fecha=12/11/1945&cod_diario=194763
#
# In 1948, the decree changing Baja California to UTC-7 specified that it
# would take effect on "this date". The decree was made on 13 March,
# but published on 5 April, so it's unclear when the change actually occurred.
# The database currently shows 5 April 1948.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?cod_diario=188624&pagina=2&seccion=0
#
# In 1949, the decree changing Baja California to UTC-8 was published on 13
# January, but it said that it would apply from 1 January, so it's unclear when
# the change actually occurred. The database currently shows 14 January 1949.
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4515613&fecha=13/01/1949&cod_diario=192309
#
# Baja California also observed UTC-7 from 1 May to 24 September 1950,
# from 29 April to 30 September 1951 at 2:00,
# and from 27 April to 28 September 1952 at 2:00....
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4600403&fecha=29/04/1950&cod_diario=197505
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4623553&fecha=23/09/1950&cod_diario=198805
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4469444&fecha=27/04/1951&cod_diario=189317
# https://www.dof.gob.mx/nota_to_imagen_fs.php?codnota=4533868&fecha=10/03/1952&cod_diario=193465
#
# All changes in Baja California from 1948 to 1952 match those in California,
# on the same dates or with a difference of one day.
# So it may be easier to implement these changes as DST with rule CA
# during this whole period.
#
# From Paul Eggert (2024-08-18):
# For now, maintain the slightly-different history for Baja California,
# as we have no information on whether 1948/1952 clocks in Tijuana followed
# the decrees or followed San Diego.
# From Alan Perry (1996-02-15):
# A guy from our Mexico subsidiary finally found the Presidential Decree
# outlining the timezone changes in Mexico.
@ -2599,7 +2654,7 @@ Zone America/Dawson -9:17:40 - LMT 1900 Aug 20
# http://puentelibre.mx/noticia/ciudad_juarez_cambio_horario_noviembre_2022/
# Rule NAME FROM TO - IN ON AT SAVE LETTER/S
Rule Mexico 1931 only - May 1 23:00 1:00 D
Rule Mexico 1931 only - April 30 0:00 1:00 D
Rule Mexico 1931 only - Oct 1 0:00 0 S
Rule Mexico 1939 only - Feb 5 0:00 1:00 D
Rule Mexico 1939 only - Jun 25 0:00 0 S
@ -2618,14 +2673,16 @@ Rule Mexico 2002 2022 - Oct lastSun 2:00 0 S
# Zone NAME STDOFF RULES FORMAT [UNTIL]
# Quintana Roo; represented by Cancún
Zone America/Cancun -5:47:04 - LMT 1922 Jan 1 6:00u
-6:00 - CST 1981 Dec 23
-6:00 - CST 1981 Dec 26 2:00
-5:00 - EST 1983 Jan 4 0:00
-6:00 Mexico C%sT 1997 Oct 26 2:00
-5:00 Mexico E%sT 1998 Aug 2 2:00
-6:00 Mexico C%sT 2015 Feb 1 2:00
-5:00 - EST
# Campeche, Yucatán; represented by Mérida
Zone America/Merida -5:58:28 - LMT 1922 Jan 1 6:00u
-6:00 - CST 1981 Dec 23
-5:00 - EST 1982 Dec 2
-6:00 - CST 1981 Dec 26 2:00
-5:00 - EST 1982 Nov 2 2:00
-6:00 Mexico C%sT
# Coahuila, Nuevo León, Tamaulipas (near US border)
# This includes the following municipios:
@ -2642,12 +2699,15 @@ Zone America/Matamoros -6:30:00 - LMT 1922 Jan 1 6:00u
-6:00 US C%sT
# Durango; Coahuila, Nuevo León, Tamaulipas (away from US border)
Zone America/Monterrey -6:41:16 - LMT 1922 Jan 1 6:00u
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1988
-6:00 US C%sT 1989
-6:00 Mexico C%sT
# Central Mexico
Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 Mexico C%sT 2001 Sep 30 2:00
@ -2658,7 +2718,7 @@ Zone America/Mexico_City -6:36:36 - LMT 1922 Jan 1 7:00u
# Práxedis G Guerrero.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@ -2673,7 +2733,7 @@ Zone America/Ciudad_Juarez -7:05:56 - LMT 1922 Jan 1 7:00u
# Benavides.
# http://gaceta.diputados.gob.mx/PDF/65/2a022/nov/20221124-VII.pdf
Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@ -2685,7 +2745,7 @@ Zone America/Ojinaga -6:57:40 - LMT 1922 Jan 1 7:00u
-6:00 US C%sT
# Chihuahua (away from US border)
Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1996
@ -2695,23 +2755,21 @@ Zone America/Chihuahua -7:04:20 - LMT 1922 Jan 1 7:00u
-6:00 - CST
# Sonora
Zone America/Hermosillo -7:23:52 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14
-8:00 - PST 1970
-7:00 - MST 1996
-7:00 Mexico M%sT 1999
-7:00 - MST
# Baja California Sur, Nayarit (except Bahía de Banderas), Sinaloa
Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14
-8:00 - PST 1970
-7:00 - MST 1970
-7:00 Mexico M%sT
# Bahía de Banderas
@ -2744,27 +2802,32 @@ Zone America/Mazatlan -7:05:40 - LMT 1922 Jan 1 7:00u
# Use "Bahia_Banderas" to keep the name to fourteen characters.
Zone America/Bahia_Banderas -7:01:00 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1927 Jun 10 23:00
-7:00 - MST 1927 Jun 10
-6:00 - CST 1930 Nov 15
-7:00 Mexico M%sT 1932 Apr 1
-6:00 - CST 1942 Apr 24
-7:00 - MST 1949 Jan 14
-8:00 - PST 1970
-7:00 - MST 1970
-7:00 Mexico M%sT 2010 Apr 4 2:00
-6:00 Mexico C%sT
# Baja California
Zone America/Tijuana -7:48:04 - LMT 1922 Jan 1 7:00u
-7:00 - MST 1924
-8:00 - PST 1927 Jun 10 23:00
-8:00 - PST 1927 Jun 10
-7:00 - MST 1930 Nov 15
-8:00 - PST 1931 Apr 1
-8:00 1:00 PDT 1931 Sep 30
-8:00 - PST 1942 Apr 24
-8:00 1:00 PWT 1945 Aug 14 23:00u
-8:00 1:00 PPT 1945 Nov 12 # Peace
-8:00 1:00 PPT 1945 Nov 15 # Peace
-8:00 - PST 1948 Apr 5
-8:00 1:00 PDT 1949 Jan 14
-8:00 - PST 1950 May 1
-8:00 1:00 PDT 1950 Sep 24
-8:00 - PST 1951 Apr 29 2:00
-8:00 1:00 PDT 1951 Sep 30 2:00
-8:00 - PST 1952 Apr 27 2:00
-8:00 1:00 PDT 1952 Sep 28 2:00
-8:00 - PST 1954
-8:00 CA P%sT 1961
-8:00 - PST 1976
@ -3573,8 +3636,8 @@ Zone America/Puerto_Rico -4:24:25 - LMT 1899 Mar 28 12:00 # San Juan
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Miquelon -3:44:40 - LMT 1911 Jun 15 # St Pierre
-4:00 - AST 1980 May
-3:00 - -03 1987
-3:00 Canada -03/-02
-3:00 - %z 1987
-3:00 Canada %z
# Turks and Caicos
#

View File

@ -425,11 +425,11 @@ Rule Arg 2008 only - Oct Sun>=15 0:00 1:00 -
Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May # Córdoba Mean Time
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 Arg -03/-02
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 Arg %z
#
# Córdoba (CB), Santa Fe (SF), Entre Ríos (ER), Corrientes (CN), Misiones (MN),
# Chaco (CC), Formosa (FM), Santiago del Estero (SE)
@ -444,120 +444,120 @@ Zone America/Argentina/Buenos_Aires -3:53:48 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
Zone America/Argentina/Cordoba -4:16:48 - LMT 1894 Oct 31
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3
-4:00 - -04 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 Arg -03/-02
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 3
-4:00 - %z 1991 Oct 20
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 Arg %z
#
# Salta (SA), La Pampa (LP), Neuquén (NQ), Rio Negro (RN)
Zone America/Argentina/Salta -4:21:40 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3
-4:00 - -04 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 3
-4:00 - %z 1991 Oct 20
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# Tucumán (TM)
Zone America/Argentina/Tucuman -4:20:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3
-4:00 - -04 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 Jun 1
-4:00 - -04 2004 Jun 13
-3:00 Arg -03/-02
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 3
-4:00 - %z 1991 Oct 20
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 Jun 1
-4:00 - %z 2004 Jun 13
-3:00 Arg %z
#
# La Rioja (LR)
Zone America/Argentina/La_Rioja -4:27:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 1
-4:00 - -04 1991 May 7
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 Jun 1
-4:00 - -04 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 1
-4:00 - %z 1991 May 7
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 Jun 1
-4:00 - %z 2004 Jun 20
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# San Juan (SJ)
Zone America/Argentina/San_Juan -4:34:04 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 1
-4:00 - -04 1991 May 7
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 May 31
-4:00 - -04 2004 Jul 25
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 1
-4:00 - %z 1991 May 7
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 May 31
-4:00 - %z 2004 Jul 25
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# Jujuy (JY)
Zone America/Argentina/Jujuy -4:21:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1990 Mar 4
-4:00 - -04 1990 Oct 28
-4:00 1:00 -03 1991 Mar 17
-4:00 - -04 1991 Oct 6
-3:00 1:00 -02 1992
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1990 Mar 4
-4:00 - %z 1990 Oct 28
-4:00 1:00 %z 1991 Mar 17
-4:00 - %z 1991 Oct 6
-3:00 1:00 %z 1992
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# Catamarca (CT), Chubut (CH)
Zone America/Argentina/Catamarca -4:23:08 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1991 Mar 3
-4:00 - -04 1991 Oct 20
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 Jun 1
-4:00 - -04 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1991 Mar 3
-4:00 - %z 1991 Oct 20
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 Jun 1
-4:00 - %z 2004 Jun 20
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# Mendoza (MZ)
Zone America/Argentina/Mendoza -4:35:16 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1990 Mar 4
-4:00 - -04 1990 Oct 15
-4:00 1:00 -03 1991 Mar 1
-4:00 - -04 1991 Oct 15
-4:00 1:00 -03 1992 Mar 1
-4:00 - -04 1992 Oct 18
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 May 23
-4:00 - -04 2004 Sep 26
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1990 Mar 4
-4:00 - %z 1990 Oct 15
-4:00 1:00 %z 1991 Mar 1
-4:00 - %z 1991 Oct 15
-4:00 1:00 %z 1992 Mar 1
-4:00 - %z 1992 Oct 18
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 May 23
-4:00 - %z 2004 Sep 26
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# San Luis (SL)
@ -567,53 +567,53 @@ Rule SanLuis 2007 2008 - Oct Sun>=8 0:00 1:00 -
Zone America/Argentina/San_Luis -4:25:24 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1990
-3:00 1:00 -02 1990 Mar 14
-4:00 - -04 1990 Oct 15
-4:00 1:00 -03 1991 Mar 1
-4:00 - -04 1991 Jun 1
-3:00 - -03 1999 Oct 3
-4:00 1:00 -03 2000 Mar 3
-3:00 - -03 2004 May 31
-4:00 - -04 2004 Jul 25
-3:00 Arg -03/-02 2008 Jan 21
-4:00 SanLuis -04/-03 2009 Oct 11
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1990
-3:00 1:00 %z 1990 Mar 14
-4:00 - %z 1990 Oct 15
-4:00 1:00 %z 1991 Mar 1
-4:00 - %z 1991 Jun 1
-3:00 - %z 1999 Oct 3
-4:00 1:00 %z 2000 Mar 3
-3:00 - %z 2004 May 31
-4:00 - %z 2004 Jul 25
-3:00 Arg %z 2008 Jan 21
-4:00 SanLuis %z 2009 Oct 11
-3:00 - %z
#
# Santa Cruz (SC)
Zone America/Argentina/Rio_Gallegos -4:36:52 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 Jun 1
-4:00 - -04 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 Jun 1
-4:00 - %z 2004 Jun 20
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
#
# Tierra del Fuego, Antártida e Islas del Atlántico Sur (TF)
Zone America/Argentina/Ushuaia -4:33:12 - LMT 1894 Oct 31
#STDOFF -4:16:48.25
-4:16:48 - CMT 1920 May
-4:00 - -04 1930 Dec
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1999 Oct 3
-4:00 Arg -04/-03 2000 Mar 3
-3:00 - -03 2004 May 30
-4:00 - -04 2004 Jun 20
-3:00 Arg -03/-02 2008 Oct 18
-3:00 - -03
-4:00 - %z 1930 Dec
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1999 Oct 3
-4:00 Arg %z 2000 Mar 3
-3:00 - %z 2004 May 30
-4:00 - %z 2004 Jun 20
-3:00 Arg %z 2008 Oct 18
-3:00 - %z
# Bolivia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/La_Paz -4:32:36 - LMT 1890
-4:32:36 - CMT 1931 Oct 15 # Calamarca MT
-4:32:36 1:00 BST 1932 Mar 21 # Bolivia ST
-4:00 - -04
-4:00 - %z
# Brazil
@ -984,12 +984,12 @@ Rule Brazil 2018 only - Nov Sun>=1 0:00 1:00 -
#
# Fernando de Noronha (administratively part of PE)
Zone America/Noronha -2:09:40 - LMT 1914
-2:00 Brazil -02/-01 1990 Sep 17
-2:00 - -02 1999 Sep 30
-2:00 Brazil -02/-01 2000 Oct 15
-2:00 - -02 2001 Sep 13
-2:00 Brazil -02/-01 2002 Oct 1
-2:00 - -02
-2:00 Brazil %z 1990 Sep 17
-2:00 - %z 1999 Sep 30
-2:00 Brazil %z 2000 Oct 15
-2:00 - %z 2001 Sep 13
-2:00 Brazil %z 2002 Oct 1
-2:00 - %z
# Other Atlantic islands have no permanent settlement.
# These include Trindade and Martim Vaz (administratively part of ES),
# Rocas Atoll (RN), and the St Peter and St Paul Archipelago (PE).
@ -1002,119 +1002,119 @@ Zone America/Noronha -2:09:40 - LMT 1914
# In the north a very small part from the river Javary (now Jari I guess,
# the border with Amapá) to the Amazon, then to the Xingu.
Zone America/Belem -3:13:56 - LMT 1914
-3:00 Brazil -03/-02 1988 Sep 12
-3:00 - -03
-3:00 Brazil %z 1988 Sep 12
-3:00 - %z
#
# west Pará (PA)
# West Pará includes Altamira, Óbidos, Prainha, Oriximiná, and Santarém.
Zone America/Santarem -3:38:48 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12
-4:00 - -04 2008 Jun 24 0:00
-3:00 - -03
-4:00 Brazil %z 1988 Sep 12
-4:00 - %z 2008 Jun 24 0:00
-3:00 - %z
#
# Maranhão (MA), Piauí (PI), Ceará (CE), Rio Grande do Norte (RN),
# Paraíba (PB)
Zone America/Fortaleza -2:34:00 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17
-3:00 - -03 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 22
-3:00 - -03 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1
-3:00 - -03
-3:00 Brazil %z 1990 Sep 17
-3:00 - %z 1999 Sep 30
-3:00 Brazil %z 2000 Oct 22
-3:00 - %z 2001 Sep 13
-3:00 Brazil %z 2002 Oct 1
-3:00 - %z
#
# Pernambuco (PE) (except Atlantic islands)
Zone America/Recife -2:19:36 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17
-3:00 - -03 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 15
-3:00 - -03 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1
-3:00 - -03
-3:00 Brazil %z 1990 Sep 17
-3:00 - %z 1999 Sep 30
-3:00 Brazil %z 2000 Oct 15
-3:00 - %z 2001 Sep 13
-3:00 Brazil %z 2002 Oct 1
-3:00 - %z
#
# Tocantins (TO)
Zone America/Araguaina -3:12:48 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17
-3:00 - -03 1995 Sep 14
-3:00 Brazil -03/-02 2003 Sep 24
-3:00 - -03 2012 Oct 21
-3:00 Brazil -03/-02 2013 Sep
-3:00 - -03
-3:00 Brazil %z 1990 Sep 17
-3:00 - %z 1995 Sep 14
-3:00 Brazil %z 2003 Sep 24
-3:00 - %z 2012 Oct 21
-3:00 Brazil %z 2013 Sep
-3:00 - %z
#
# Alagoas (AL), Sergipe (SE)
Zone America/Maceio -2:22:52 - LMT 1914
-3:00 Brazil -03/-02 1990 Sep 17
-3:00 - -03 1995 Oct 13
-3:00 Brazil -03/-02 1996 Sep 4
-3:00 - -03 1999 Sep 30
-3:00 Brazil -03/-02 2000 Oct 22
-3:00 - -03 2001 Sep 13
-3:00 Brazil -03/-02 2002 Oct 1
-3:00 - -03
-3:00 Brazil %z 1990 Sep 17
-3:00 - %z 1995 Oct 13
-3:00 Brazil %z 1996 Sep 4
-3:00 - %z 1999 Sep 30
-3:00 Brazil %z 2000 Oct 22
-3:00 - %z 2001 Sep 13
-3:00 Brazil %z 2002 Oct 1
-3:00 - %z
#
# Bahia (BA)
# There are too many Salvadors elsewhere, so use America/Bahia instead
# of America/Salvador.
Zone America/Bahia -2:34:04 - LMT 1914
-3:00 Brazil -03/-02 2003 Sep 24
-3:00 - -03 2011 Oct 16
-3:00 Brazil -03/-02 2012 Oct 21
-3:00 - -03
-3:00 Brazil %z 2003 Sep 24
-3:00 - %z 2011 Oct 16
-3:00 Brazil %z 2012 Oct 21
-3:00 - %z
#
# Goiás (GO), Distrito Federal (DF), Minas Gerais (MG),
# Espírito Santo (ES), Rio de Janeiro (RJ), São Paulo (SP), Paraná (PR),
# Santa Catarina (SC), Rio Grande do Sul (RS)
Zone America/Sao_Paulo -3:06:28 - LMT 1914
-3:00 Brazil -03/-02 1963 Oct 23 0:00
-3:00 1:00 -02 1964
-3:00 Brazil -03/-02
-3:00 Brazil %z 1963 Oct 23 0:00
-3:00 1:00 %z 1964
-3:00 Brazil %z
#
# Mato Grosso do Sul (MS)
Zone America/Campo_Grande -3:38:28 - LMT 1914
-4:00 Brazil -04/-03
-4:00 Brazil %z
#
# Mato Grosso (MT)
Zone America/Cuiaba -3:44:20 - LMT 1914
-4:00 Brazil -04/-03 2003 Sep 24
-4:00 - -04 2004 Oct 1
-4:00 Brazil -04/-03
-4:00 Brazil %z 2003 Sep 24
-4:00 - %z 2004 Oct 1
-4:00 Brazil %z
#
# Rondônia (RO)
Zone America/Porto_Velho -4:15:36 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12
-4:00 - -04
-4:00 Brazil %z 1988 Sep 12
-4:00 - %z
#
# Roraima (RR)
Zone America/Boa_Vista -4:02:40 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12
-4:00 - -04 1999 Sep 30
-4:00 Brazil -04/-03 2000 Oct 15
-4:00 - -04
-4:00 Brazil %z 1988 Sep 12
-4:00 - %z 1999 Sep 30
-4:00 Brazil %z 2000 Oct 15
-4:00 - %z
#
# east Amazonas (AM): Boca do Acre, Jutaí, Manaus, Floriano Peixoto
# The great circle line from Tabatinga to Porto Acre divides
# east from west Amazonas.
Zone America/Manaus -4:00:04 - LMT 1914
-4:00 Brazil -04/-03 1988 Sep 12
-4:00 - -04 1993 Sep 28
-4:00 Brazil -04/-03 1994 Sep 22
-4:00 - -04
-4:00 Brazil %z 1988 Sep 12
-4:00 - %z 1993 Sep 28
-4:00 Brazil %z 1994 Sep 22
-4:00 - %z
#
# west Amazonas (AM): Atalaia do Norte, Boca do Maoco, Benjamin Constant,
# Eirunepé, Envira, Ipixuna
Zone America/Eirunepe -4:39:28 - LMT 1914
-5:00 Brazil -05/-04 1988 Sep 12
-5:00 - -05 1993 Sep 28
-5:00 Brazil -05/-04 1994 Sep 22
-5:00 - -05 2008 Jun 24 0:00
-4:00 - -04 2013 Nov 10
-5:00 - -05
-5:00 Brazil %z 1988 Sep 12
-5:00 - %z 1993 Sep 28
-5:00 Brazil %z 1994 Sep 22
-5:00 - %z 2008 Jun 24 0:00
-4:00 - %z 2013 Nov 10
-5:00 - %z
#
# Acre (AC)
Zone America/Rio_Branco -4:31:12 - LMT 1914
-5:00 Brazil -05/-04 1988 Sep 12
-5:00 - -05 2008 Jun 24 0:00
-4:00 - -04 2013 Nov 10
-5:00 - -05
-5:00 Brazil %z 1988 Sep 12
-5:00 - %z 2008 Jun 24 0:00
-4:00 - %z 2013 Nov 10
-5:00 - %z
# Chile
@ -1382,36 +1382,36 @@ Rule Chile 2023 max - Sep Sun>=2 4:00u 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Santiago -4:42:45 - LMT 1890
-4:42:45 - SMT 1910 Jan 10 # Santiago Mean Time
-5:00 - -05 1916 Jul 1
-5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10
-4:00 - -04 1919 Jul 1
-4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1
-5:00 Chile -05/-04 1932 Sep 1
-4:00 - -04 1942 Jun 1
-5:00 - -05 1942 Aug 1
-4:00 - -04 1946 Jul 14 24:00
-4:00 1:00 -03 1946 Aug 28 24:00 # central CL
-5:00 1:00 -04 1947 Mar 31 24:00
-5:00 - -05 1947 May 21 23:00
-4:00 Chile -04/-03
-5:00 Chile %z 1932 Sep 1
-4:00 - %z 1942 Jun 1
-5:00 - %z 1942 Aug 1
-4:00 - %z 1946 Jul 14 24:00
-4:00 1:00 %z 1946 Aug 28 24:00 # central CL
-5:00 1:00 %z 1947 Mar 31 24:00
-5:00 - %z 1947 May 21 23:00
-4:00 Chile %z
Zone America/Punta_Arenas -4:43:40 - LMT 1890
-4:42:45 - SMT 1910 Jan 10
-5:00 - -05 1916 Jul 1
-5:00 - %z 1916 Jul 1
-4:42:45 - SMT 1918 Sep 10
-4:00 - -04 1919 Jul 1
-4:00 - %z 1919 Jul 1
-4:42:45 - SMT 1927 Sep 1
-5:00 Chile -05/-04 1932 Sep 1
-4:00 - -04 1942 Jun 1
-5:00 - -05 1942 Aug 1
-4:00 - -04 1946 Aug 28 24:00
-5:00 1:00 -04 1947 Mar 31 24:00
-5:00 - -05 1947 May 21 23:00
-4:00 Chile -04/-03 2016 Dec 4
-3:00 - -03
-5:00 Chile %z 1932 Sep 1
-4:00 - %z 1942 Jun 1
-5:00 - %z 1942 Aug 1
-4:00 - %z 1946 Aug 28 24:00
-5:00 1:00 %z 1947 Mar 31 24:00
-5:00 - %z 1947 May 21 23:00
-4:00 Chile %z 2016 Dec 4
-3:00 - %z
Zone Pacific/Easter -7:17:28 - LMT 1890
-7:17:28 - EMT 1932 Sep # Easter Mean Time
-7:00 Chile -07/-06 1982 Mar 14 3:00u # Easter Time
-6:00 Chile -06/-05
-7:00 Chile %z 1982 Mar 14 3:00u # Easter Time
-6:00 Chile %z
#
# Salas y Gómez Island is uninhabited.
# Other Chilean locations, including Juan Fernández Is, Desventuradas Is,
@ -1431,10 +1431,10 @@ Zone Pacific/Easter -7:17:28 - LMT 1890
#
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Antarctica/Palmer 0 - -00 1965
-4:00 Arg -04/-03 1969 Oct 5
-3:00 Arg -03/-02 1982 May
-4:00 Chile -04/-03 2016 Dec 4
-3:00 - -03
-4:00 Arg %z 1969 Oct 5
-3:00 Arg %z 1982 May
-4:00 Chile %z 2016 Dec 4
-3:00 - %z
# Colombia
@ -1453,7 +1453,7 @@ Rule CO 1993 only - Feb 6 24:00 0 -
#STDOFF -4:56:16.4
Zone America/Bogota -4:56:16 - LMT 1884 Mar 13
-4:56:16 - BMT 1914 Nov 23 # Bogotá Mean Time
-5:00 CO -05/-04
-5:00 CO %z
# Malpelo, Providencia, San Andres
# no information; probably like America/Bogota
@ -1484,10 +1484,10 @@ Rule Ecuador 1993 only - Feb 5 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guayaquil -5:19:20 - LMT 1890
-5:14:00 - QMT 1931 # Quito Mean Time
-5:00 Ecuador -05/-04
-5:00 Ecuador %z
Zone Pacific/Galapagos -5:58:24 - LMT 1931 # Puerto Baquerizo Moreno
-5:00 - -05 1986
-6:00 Ecuador -06/-05
-5:00 - %z 1986
-6:00 Ecuador %z
# Falklands
@ -1587,10 +1587,10 @@ Rule Falk 2001 2010 - Sep Sun>=1 2:00 1:00 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/Stanley -3:51:24 - LMT 1890
-3:51:24 - SMT 1912 Mar 12 # Stanley Mean Time
-4:00 Falk -04/-03 1983 May
-3:00 Falk -03/-02 1985 Sep 15
-4:00 Falk -04/-03 2010 Sep 5 2:00
-3:00 - -03
-4:00 Falk %z 1983 May
-3:00 Falk %z 1985 Sep 15
-4:00 Falk %z 2010 Sep 5 2:00
-3:00 - %z
# French Guiana
# For the 1911/1912 establishment of standard time in French possessions, see:
@ -1598,8 +1598,8 @@ Zone Atlantic/Stanley -3:51:24 - LMT 1890
# page 752, 18b.
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
-4:00 - -04 1967 Oct
-3:00 - -03
-4:00 - %z 1967 Oct
-3:00 - %z
# Guyana
@ -1633,10 +1633,10 @@ Zone America/Cayenne -3:29:20 - LMT 1911 Jul 1
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Guyana -3:52:39 - LMT 1911 Aug 1 # Georgetown
-4:00 - -04 1915 Mar 1
-3:45 - -0345 1975 Aug 1
-3:00 - -03 1992 Mar 29 1:00
-4:00 - -04
-4:00 - %z 1915 Mar 1
-3:45 - %z 1975 Aug 1
-3:00 - %z 1992 Mar 29 1:00
-4:00 - %z
# Paraguay
#
@ -1734,9 +1734,9 @@ Rule Para 2013 max - Mar Sun>=22 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Asuncion -3:50:40 - LMT 1890
-3:50:40 - AMT 1931 Oct 10 # Asunción Mean Time
-4:00 - -04 1972 Oct
-3:00 - -03 1974 Apr
-4:00 Para -04/-03
-4:00 - %z 1972 Oct
-3:00 - %z 1974 Apr
-4:00 Para %z
# Peru
#
@ -1763,12 +1763,12 @@ Rule Peru 1994 only - Apr 1 0:00 0 -
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Lima -5:08:12 - LMT 1890
-5:08:36 - LMT 1908 Jul 28 # Lima Mean Time?
-5:00 Peru -05/-04
-5:00 Peru %z
# South Georgia
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
-2:00 - -02
-2:00 - %z
# South Sandwich Is
# uninhabited; scientific personnel have wintered
@ -1778,8 +1778,8 @@ Zone Atlantic/South_Georgia -2:26:08 - LMT 1890 # Grytviken
Zone America/Paramaribo -3:40:40 - LMT 1911
-3:40:52 - PMT 1935 # Paramaribo Mean Time
-3:40:36 - PMT 1945 Oct # The capital moved?
-3:30 - -0330 1984 Oct
-3:00 - -03
-3:30 - %z 1984 Oct
-3:00 - %z
# Uruguay
# From Paul Eggert (1993-11-18):
@ -1994,15 +1994,15 @@ Rule Uruguay 2006 2014 - Oct Sun>=1 2:00 1:00 -
# This Zone can be simplified once we assume zic %z.
Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
-3:44:51 - MMT 1920 May 1 # Montevideo MT
-4:00 - -04 1923 Oct 1
-3:30 Uruguay -0330/-03 1942 Dec 14
-3:00 Uruguay -03/-0230 1960
-3:00 Uruguay -03/-02 1968
-3:00 Uruguay -03/-0230 1970
-3:00 Uruguay -03/-02 1974
-3:00 Uruguay -03/-0130 1974 Mar 10
-3:00 Uruguay -03/-0230 1974 Dec 22
-3:00 Uruguay -03/-02
-4:00 - %z 1923 Oct 1
-3:30 Uruguay %z 1942 Dec 14
-3:00 Uruguay %z 1960
-3:00 Uruguay %z 1968
-3:00 Uruguay %z 1970
-3:00 Uruguay %z 1974
-3:00 Uruguay %z 1974 Mar 10
-3:00 Uruguay %z 1974 Dec 22
-3:00 Uruguay %z
# Venezuela
#
@ -2036,7 +2036,7 @@ Zone America/Montevideo -3:44:51 - LMT 1908 Jun 10
# Zone NAME STDOFF RULES FORMAT [UNTIL]
Zone America/Caracas -4:27:44 - LMT 1890
-4:27:40 - CMT 1912 Feb 12 # Caracas Mean Time?
-4:30 - -0430 1965 Jan 1 0:00
-4:00 - -04 2007 Dec 9 3:00
-4:30 - -0430 2016 May 1 2:30
-4:00 - -04
-4:30 - %z 1965 Jan 1 0:00
-4:00 - %z 2007 Dec 9 3:00
-4:30 - %z 2016 May 1 2:30
-4:00 - %z

View File

@ -287,8 +287,7 @@ MK +4159+02126 Europe/Skopje
ML +1239-00800 Africa/Bamako
MM +1647+09610 Asia/Yangon
MN +4755+10653 Asia/Ulaanbaatar most of Mongolia
MN +4801+09139 Asia/Hovd Bayan-Olgiy, Govi-Altai, Hovd, Uvs, Zavkhan
MN +4804+11430 Asia/Choibalsan Dornod, Sukhbaatar
MN +4801+09139 Asia/Hovd Bayan-Olgii, Hovd, Uvs
MO +221150+1133230 Asia/Macau
MP +1512+14545 Pacific/Saipan
MQ +1436-06105 America/Martinique

View File

@ -528,7 +528,7 @@ jint unix_getChildren(JNIEnv *env, jlong jpid, jlongArray jarray,
* position integer as a filename.
*/
if ((dir = opendir("/proc")) == NULL) {
JNU_ThrowByNameWithLastError(env,
JNU_ThrowByNameWithMessageAndLastError(env,
"java/lang/RuntimeException", "Unable to open /proc");
return -1;
}

View File

@ -60,35 +60,33 @@ import static sun.awt.screencast.ScreencastHelper.SCREENCAST_DEBUG;
* The restore token allows the ScreenCast session to be restored
* with previously granted screen access permissions.
*/
@SuppressWarnings("removal")
final class TokenStorage {
private TokenStorage() {}
private static final String REL_NAME =
".java/robot/screencast-tokens.properties";
private static final String REL_NAME_SECONDARY =
".awt/robot/screencast-tokens.properties";
private static final Properties PROPS = new Properties();
private static final Path PROPS_PATH;
private static final Path PROP_FILENAME;
@SuppressWarnings("removal")
private static void doPrivilegedRunnable(Runnable runnable) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
@Override
public Void run() {
runnable.run();
return null;
}
AccessController.doPrivileged((PrivilegedAction<Void>) () -> {
runnable.run();
return null;
});
}
static {
PROPS_PATH = AccessController.doPrivileged(new PrivilegedAction<Path>() {
@Override
public Path run() {
return setupPath();
}
});
@SuppressWarnings("removal")
Path propsPath = AccessController
.doPrivileged((PrivilegedAction<Path>) () -> setupPath());
PROPS_PATH = propsPath;
if (PROPS_PATH != null) {
PROP_FILENAME = PROPS_PATH.getFileName();
@ -110,27 +108,34 @@ final class TokenStorage {
}
Path path = Path.of(userHome, REL_NAME);
Path secondaryPath = Path.of(userHome, REL_NAME_SECONDARY);
boolean copyFromSecondary = !Files.isWritable(path)
&& Files.isWritable(secondaryPath);
Path workdir = path.getParent();
if (!Files.exists(workdir)) {
try {
Files.createDirectories(workdir);
} catch (Exception e) {
if (!Files.isWritable(path)) {
if (!Files.exists(workdir)) {
try {
Files.createDirectories(workdir);
} catch (Exception e) {
if (SCREENCAST_DEBUG) {
System.err.printf("Token storage: cannot create" +
" directory %s %s\n", workdir, e);
}
return null;
}
}
if (!Files.isWritable(workdir)) {
if (SCREENCAST_DEBUG) {
System.err.printf("Token storage: cannot create" +
" directory %s %s\n", workdir, e);
System.err.printf("Token storage: %s is not writable\n", workdir);
}
return null;
}
}
if (!Files.isWritable(workdir)) {
if (SCREENCAST_DEBUG) {
System.err.printf("Token storage: %s is not writable\n", workdir);
}
return null;
}
try {
Files.setPosixFilePermissions(
workdir,
@ -145,7 +150,17 @@ final class TokenStorage {
}
}
if (Files.exists(path)) {
if (copyFromSecondary) {
if (SCREENCAST_DEBUG) {
System.out.println("Token storage: copying from the secondary location "
+ secondaryPath);
}
synchronized (PROPS) {
if (readTokens(secondaryPath)) {
store(path, "copy from the secondary location");
}
}
} else if (Files.exists(path)) {
if (!setFilePermission(path)) {
return null;
}
@ -302,7 +317,7 @@ final class TokenStorage {
}
if (changed) {
doPrivilegedRunnable(() -> store("save tokens"));
doPrivilegedRunnable(() -> store(PROPS_PATH, "save tokens"));
}
}
}
@ -315,7 +330,7 @@ final class TokenStorage {
PROPS.clear();
PROPS.load(reader);
}
} catch (IOException e) {
} catch (IOException | IllegalArgumentException e) {
if (SCREENCAST_DEBUG) {
System.err.printf("""
Token storage: failed to load property file %s
@ -410,7 +425,7 @@ final class TokenStorage {
}
private static void removeMalformedRecords(Set<String> malformedRecords) {
if (!isWritable()
if (!isWritable(PROPS_PATH)
|| malformedRecords == null
|| malformedRecords.isEmpty()) {
return;
@ -424,17 +439,17 @@ final class TokenStorage {
}
}
store("remove malformed records");
store(PROPS_PATH, "remove malformed records");
}
}
private static void store(String failMsg) {
if (!isWritable()) {
private static void store(Path path, String failMsg) {
if (!isWritable(path)) {
return;
}
synchronized (PROPS) {
try (BufferedWriter writer = Files.newBufferedWriter(PROPS_PATH)) {
try (BufferedWriter writer = Files.newBufferedWriter(path)) {
PROPS.store(writer, null);
} catch (IOException e) {
if (SCREENCAST_DEBUG) {
@ -445,13 +460,13 @@ final class TokenStorage {
}
}
private static boolean isWritable() {
if (PROPS_PATH == null
|| (Files.exists(PROPS_PATH) && !Files.isWritable(PROPS_PATH))) {
private static boolean isWritable(Path path) {
if (path == null
|| (Files.exists(path) && !Files.isWritable(path))) {
if (SCREENCAST_DEBUG) {
System.err.printf(
"Token storage: %s is not writable\n", PROPS_PATH);
"Token storage: %s is not writable\n", path);
}
return false;
} else {

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
* 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
@ -55,13 +55,11 @@ typedef enum
} GParamFlags;
/* We define all structure pointers to be void* */
typedef void GMainContext;
typedef void GVfs;
typedef void GdkColormap;
typedef void GdkDrawable;
typedef void GdkGC;
typedef void GdkPixbuf;
typedef void GdkPixmap;
typedef void GtkFixed;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2005, 2023, Oracle and/or its affiliates. All rights reserved.
* 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
@ -180,8 +180,6 @@ typedef enum _cairo_status {
} cairo_status_t;
/* We define all structure pointers to be void* */
typedef void GdkPixbuf;
typedef void GMainContext;
typedef void GVfs;
typedef void GdkColormap;

View File

@ -62,6 +62,7 @@ import com.sun.tools.javac.file.PathFileObject;
import com.sun.tools.javac.jvm.ClassFile.Version;
import com.sun.tools.javac.jvm.PoolConstant.NameAndType;
import com.sun.tools.javac.main.Option;
import com.sun.tools.javac.resources.CompilerProperties.Errors;
import com.sun.tools.javac.resources.CompilerProperties.Fragments;
import com.sun.tools.javac.resources.CompilerProperties.Warnings;
import com.sun.tools.javac.util.*;
@ -2311,9 +2312,17 @@ public class ClassReader {
* 4.7.20-A target_type to locate the correct type to rewrite, and then interpreting the JVMS
* 4.7.20.2 type_path to associate the annotation with the correct contained type.
*/
private static void addTypeAnnotationsToSymbol(
Symbol s, List<Attribute.TypeCompound> attributes) {
new TypeAnnotationSymbolVisitor(attributes).visit(s, null);
private void addTypeAnnotationsToSymbol(Symbol s, List<Attribute.TypeCompound> attributes) {
try {
new TypeAnnotationSymbolVisitor(attributes).visit(s, null);
} catch (CompletionFailure ex) {
JavaFileObject prev = log.useSource(currentClassFile);
try {
log.error(Errors.CantAttachTypeAnnotations(attributes, s.owner, s.name, ex.getDetailValue()));
} finally {
log.useSource(prev);
}
}
}
private static class TypeAnnotationSymbolVisitor

View File

@ -2345,6 +2345,11 @@ compiler.warn.annotation.method.not.found=\
compiler.warn.annotation.method.not.found.reason=\
Cannot find annotation method ''{1}()'' in type ''{0}'': {2}
# 0: list of annotation, 1: symbol, 2: name, 3: message segment
compiler.err.cant.attach.type.annotations=\
Cannot attach type annotations {0} to {1}.{2}:\n\
{3}
# 0: file object, 1: symbol, 2: name
compiler.warn.unknown.enum.constant=\
unknown enum constant {1}.{2}

View File

@ -104,12 +104,15 @@ final class HotSpotJVMCICompilerConfig {
}
}
if (factory == null) {
String reason;
if (Services.IS_IN_NATIVE_IMAGE) {
throw runtime.exitHotSpotWithMessage(1, "JVMCI compiler '%s' not found in JVMCI native library.%n" +
reason = String.format("JVMCI compiler '%s' not found in JVMCI native library.%n" +
"Use -XX:-UseJVMCINativeLibrary when specifying a JVMCI compiler available on a class path with %s.%n",
compilerName, compPropertyName);
} else {
reason = String.format("JVMCI compiler '%s' specified by %s not found%n", compilerName, compPropertyName);
}
throw runtime.exitHotSpotWithMessage(1, "JVMCI compiler '%s' specified by %s not found%n", compilerName, compPropertyName);
factory = new DummyCompilerFactory(reason, runtime);
}
}
} else {

View File

@ -25,6 +25,7 @@
* @test
* @library /test/lib /
* @requires vm.flagless
* @requires ! vm.opt.final.UnlockExperimentalVMOptions
* @requires vm.compMode != "Xint"
* @run driver compiler.blackhole.BlackholeExperimentalUnlockTest
*/

View File

@ -26,8 +26,8 @@
* @bug 8251093
* @summary Sanity check the flag TraceLinearScanLevel with the highest level in a silent HelloWorld program.
*
* @requires vm.debug == true & vm.compiler1.enabled
* @run main/othervm -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
* @requires vm.debug == true & vm.compiler1.enabled & vm.compMode != "Xcomp"
* @run main/othervm -Xbatch -XX:TraceLinearScanLevel=4 compiler.c1.TestTraceLinearScanLevel
*/
package compiler.c1;

View File

@ -0,0 +1,170 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StablePrimArrayTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StablePrimArrayTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static final int[] EMPTY_INTEGER = new int[] { 0 };
static final int[] FULL_INTEGER = new int[] { 42 };
static class Carrier {
@Stable
int[] field;
@ForceInline
public Carrier(int initLevel) {
switch (initLevel) {
case 0:
// Do nothing.
break;
case 1:
field = EMPTY_INTEGER;
break;
case 2:
field = FULL_INTEGER;
break;
default:
throw new IllegalStateException("Unknown level");
}
}
@ForceInline
public void initEmpty() {
field = EMPTY_INTEGER;
}
@ForceInline
public void initFull() {
field = FULL_INTEGER;
}
}
static final Carrier BLANK_CARRIER = new Carrier(0);
static final Carrier INIT_EMPTY_CARRIER = new Carrier(1);
static final Carrier INIT_FULL_CARRIER = new Carrier(2);
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for plain fields.
int[] is = BLANK_CARRIER.field;
if (is != null) {
return is[0];
}
return 0;
}
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testPartialFold() {
// Access should not be folded.
// No barriers expected for plain fields.
int[] is = INIT_EMPTY_CARRIER.field;
if (is != null) {
return is[0];
}
return 0;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
int[] is = INIT_FULL_CARRIER.field;
if (is != null) {
return is[0];
}
return 0;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Only the header barrier.
return new Carrier(0);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorEmptyInit() {
// Only the header barrier.
return new Carrier(1);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorFullInit() {
// Only the header barrier.
return new Carrier(2);
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodEmptyInit() {
// Reference inits do not have membars.
INIT_EMPTY_CARRIER.initEmpty();
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodFullInit() {
// Reference inits do not have membars.
INIT_FULL_CARRIER.initFull();
}
}

View File

@ -0,0 +1,100 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StablePrimFinalTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StablePrimFinalTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static class Carrier {
@Stable
final int field;
@ForceInline
public Carrier(boolean init) {
field = init ? 42 : 0;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, "1" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for final fields.
return BLANK_CARRIER.field;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
return INIT_CARRIER.field;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Single header+final barrier.
return new Carrier(false);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorFullInit() {
// Single header+final barrier.
return new Carrier(true);
}
}

View File

@ -0,0 +1,114 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StablePrimPlainTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StablePrimPlainTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static class Carrier {
@Stable
int field;
@ForceInline
public Carrier(boolean init) {
if (init) {
field = 42;
}
}
@ForceInline
public void init() {
field = 42;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, "1" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for plain fields.
return BLANK_CARRIER.field;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
return INIT_CARRIER.field;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Only the header barrier.
return new Carrier(false);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorFullInit() {
// Only the header barrier.
return new Carrier(true);
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodInit() {
// Primitive inits have no membars.
INIT_CARRIER.init();
}
}

View File

@ -0,0 +1,114 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StablePrimVolatileTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StablePrimVolatileTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static class Carrier {
@Stable
volatile int field;
@ForceInline
public Carrier(boolean init) {
if (init) {
field = 42;
}
}
@ForceInline
public void init() {
field = 42;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, "1" })
@IR(counts = { IRNode.MEMBAR, ">0" })
static int testNoFold() {
// Access should not be folded.
// Barriers expected for volatile fields.
return BLANK_CARRIER.field;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
return INIT_CARRIER.field;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Expect only the header barrier.
return new Carrier(false);
}
@Test
@IR(counts = { IRNode.MEMBAR, ">0" })
static Carrier testConstructorFullInit() {
// Volatile barriers expected.
return new Carrier(true);
}
@Test
@IR(counts = { IRNode.MEMBAR, ">0" })
static void testMethodInit() {
// Volatile barriers expected.
INIT_CARRIER.init();
}
}

View File

@ -0,0 +1,179 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StableRefArrayTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StableRefArrayTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static final Integer[] EMPTY_INTEGER = new Integer[] { null };
static final Integer[] FULL_INTEGER = new Integer[] { 42 };
static class Carrier {
@Stable
Integer[] field;
@ForceInline
public Carrier(int initLevel) {
switch (initLevel) {
case 0:
// Do nothing.
break;
case 1:
field = EMPTY_INTEGER;
break;
case 2:
field = FULL_INTEGER;
break;
default:
throw new IllegalStateException("Unknown level");
}
}
@ForceInline
public void initEmpty() {
field = EMPTY_INTEGER;
}
@ForceInline
public void initFull() {
field = FULL_INTEGER;
}
}
static final Carrier BLANK_CARRIER = new Carrier(0);
static final Carrier INIT_EMPTY_CARRIER = new Carrier(1);
static final Carrier INIT_FULL_CARRIER = new Carrier(2);
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for plain fields.
Integer[] is = BLANK_CARRIER.field;
if (is != null) {
Integer i = is[0];
if (i != null) {
return i;
}
}
return 0;
}
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testPartialFold() {
// Access should not be folded.
// No barriers expected for plain fields.
Integer[] is = INIT_EMPTY_CARRIER.field;
if (is != null) {
Integer i = is[0];
if (i != null) {
return i;
}
}
return 0;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
Integer[] is = INIT_FULL_CARRIER.field;
if (is != null) {
Integer i = is[0];
if (i != null) {
return i;
}
}
return 0;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Only the header barrier.
return new Carrier(0);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorEmptyInit() {
// Only the header barrier.
return new Carrier(1);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorFullInit() {
// Only the header barrier.
return new Carrier(2);
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodEmptyInit() {
// Reference inits do not have membars.
INIT_EMPTY_CARRIER.initEmpty();
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodFullInit() {
// Reference inits do not have membars.
INIT_FULL_CARRIER.initFull();
}
}

View File

@ -0,0 +1,97 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StableRefFinalTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StableRefFinalTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static final Integer INTEGER = 42;
static class Carrier {
@Stable
final Integer field;
@ForceInline
public Carrier(boolean init) {
field = init ? INTEGER : null;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for plain fields.
Integer i = BLANK_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
Integer i = INIT_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorInit() {
// Only the header+final barrier.
return new Carrier(true);
}
}

View File

@ -0,0 +1,118 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StableRefPlainTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StableRefPlainTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static final Integer INTEGER = 42;
static class Carrier {
@Stable
Integer field;
@ForceInline
public Carrier(boolean init) {
if (init) {
field = INTEGER;
}
}
@ForceInline
public void init() {
field = INTEGER;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(failOn = { IRNode.MEMBAR })
static int testNoFold() {
// Access should not be folded.
// No barriers expected for plain fields.
Integer i = BLANK_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
Integer i = INIT_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Only the header barrier.
return new Carrier(false);
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorFullInit() {
// Only the header barrier.
return new Carrier(true);
}
@Test
@IR(failOn = { IRNode.MEMBAR })
static void testMethodInit() {
// Reference inits do not have membars.
INIT_CARRIER.init();
}
}

View File

@ -0,0 +1,118 @@
/*
* 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
* @bug 8333791
* @requires os.arch=="aarch64" | os.arch=="riscv64" | os.arch=="x86_64" | os.arch=="amd64"
* @requires vm.gc.Parallel
* @requires vm.compiler2.enabled
* @summary Check stable field folding and barriers
* @modules java.base/jdk.internal.vm.annotation
* @library /test/lib /
* @run driver compiler.c2.irTests.stable.StableRefVolatileTest
*/
package compiler.c2.irTests.stable;
import compiler.lib.ir_framework.*;
import jdk.test.lib.Asserts;
import jdk.internal.vm.annotation.Stable;
public class StableRefVolatileTest {
public static void main(String[] args) {
TestFramework tf = new TestFramework();
tf.addTestClassesToBootClassPath();
tf.addFlags(
"-XX:+UnlockExperimentalVMOptions",
"-XX:CompileThreshold=100",
"-XX:-TieredCompilation",
"-XX:+UseParallelGC"
);
tf.start();
}
static final Integer INTEGER = 42;
static class Carrier {
@Stable
volatile Integer field;
@ForceInline
public Carrier(boolean init) {
if (init) {
field = INTEGER;
}
}
@ForceInline
public void init() {
field = INTEGER;
}
}
static final Carrier BLANK_CARRIER = new Carrier(false);
static final Carrier INIT_CARRIER = new Carrier(true);
@Test
@IR(counts = { IRNode.LOAD, ">0" })
@IR(counts = { IRNode.MEMBAR, ">0" })
static int testNoFold() {
// Access should not be folded.
// Barriers are expected for volatile field.
Integer i = BLANK_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(failOn = { IRNode.LOAD, IRNode.MEMBAR })
static int testFold() {
// Access should be completely folded.
Integer i = INIT_CARRIER.field;
return i != null ? i : 0;
}
@Test
@IR(counts = { IRNode.MEMBAR_STORESTORE, "1" })
static Carrier testConstructorBlankInit() {
// Only the header barrier.
return new Carrier(false);
}
@Test
@IR(counts = { IRNode.MEMBAR, ">0" })
static Carrier testConstructorFullInit() {
// Volatile writes, expect more barriers.
return new Carrier(true);
}
@Test
@IR(counts = { IRNode.MEMBAR, ">0" })
static void testMethodInit() {
// Barriers are expected for volatile fields.
INIT_CARRIER.init();
}
}

View File

@ -0,0 +1,44 @@
/*
* 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.
*/
/**
* @test
* @bug 8337066
* @summary Test that MergeMem is skipped when looking for stores
* @run main/othervm -Xbatch -XX:-TieredCompilation
* -XX:CompileCommand=compileonly,java.lang.StringUTF16::reverse
* compiler.controldependency.TestAntiDependencyForPinnedLoads
*/
package compiler.controldependency;
public class TestAntiDependencyForPinnedLoads {
public static void main(String[] args) {
for(int i = 0; i < 50_000; i++) {
String str = "YYYY年MM月DD日";
StringBuffer strBuffer = new StringBuffer(str);
String revStr = strBuffer.reverse().toString();
if (!revStr.equals("日DD月MM年YYYY")) throw new InternalError("FAIL");
}
}
}

View File

@ -0,0 +1,57 @@
/*
* 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.
*/
/*
* @test
* @bug 8335709
* @summary C2: assert(!loop->is_member(get_loop(useblock))) failed: must be outside loop
* @library /test/lib
* @run main/othervm -Xcomp -XX:CompileCommand=compileonly,InfiniteLoopBadControlNeverBranch::* InfiniteLoopBadControlNeverBranch
*
*/
import jdk.test.lib.Utils;
public class InfiniteLoopBadControlNeverBranch {
static int b;
static short c;
public static void main(String[] args) throws InterruptedException {
Thread thread = new Thread(() -> test());
thread.setDaemon(true);
thread.start();
Thread.sleep(Utils.adjustTimeout(4000));
}
static void test() {
int i = 0;
while (true) {
if (i > 1) {
b = 0;
}
c = (short) (b * 7);
i++;
}
}
}

View File

@ -0,0 +1,101 @@
/*
* Copyright (c) 2024, Red Hat, Inc. All rights reserved.
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
*
* This code is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License version 2 only, as
* published by the Free Software Foundation.
*
* This code is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* version 2 for more details (a copy is included in the LICENSE file that
* accompanied this code).
*
* You should have received a copy of the GNU General Public License version
* 2 along with this work; if not, write to the Free Software Foundation,
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
*
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
* or visit www.oracle.com if you need additional information or have any
* questions.
*/
/**
* @test
* @bug 8340214
* @summary C2 compilation asserts with "no node with a side effect" in PhaseIdealLoop::try_sink_out_of_loop
*
* @run main/othervm -XX:-BackgroundCompilation TestBadMemSliceWithInterfaces
*
*/
public class TestBadMemSliceWithInterfaces {
public static void main(String[] args) {
B b = new B();
C c = new C();
for (int i = 0; i < 20_000; i++) {
test1(b, c, true);
test1(b, c, false);
b.field = 0;
c.field = 0;
int res = test2(b, c, true);
if (res != 42) {
throw new RuntimeException("incorrect result " + res);
}
res = test2(b, c, false);
if (res != 42) {
throw new RuntimeException("incorrect result " + res);
}
}
}
private static void test1(B b, C c, boolean flag) {
A a;
if (flag) {
a = b;
} else {
a = c;
}
for (int i = 0; i < 1000; i++) {
a.field = 42;
}
}
private static int test2(B b, C c, boolean flag) {
A a;
if (flag) {
a = b;
} else {
a = c;
}
int v = 0;
for (int i = 0; i < 2; i++) {
v += a.field;
a.field = 42;
}
return v;
}
interface I {
void m();
}
static class A {
int field;
}
static class B extends A implements I {
@Override
public void m() {
}
}
static class C extends A implements I {
@Override
public void m() {
}
}
}

View File

@ -27,6 +27,7 @@ package gc.arguments;
* @test TestParallelGCErgo
* @bug 8272364
* @requires vm.gc.Parallel
* @requires vm.opt.UseLargePages == null | !vm.opt.UseLargePages
* @summary Verify ParallelGC minimum young and old ergonomics are setup correctly
* @modules java.base/jdk.internal.misc
* @library /test/lib

View File

@ -22,14 +22,37 @@
*/
/*
* @test
* @test VMOptionWarningExperimental
* @bug 8027314
* @summary Warn if diagnostic or experimental vm option is used and -XX:+UnlockDiagnosticVMOptions or -XX:+UnlockExperimentalVMOptions, respectively, isn't specified. Warn if develop vm option is used with product version of VM.
* @summary Warn if experimental vm option is used and -XX:+UnlockExperimentalVMOptions isn't specified.
* @requires vm.flagless
* @requires ! vm.opt.final.UnlockExperimentalVMOptions
* @library /test/lib
* @modules java.base/jdk.internal.misc
* java.management
* @run driver VMOptionWarning
* @run driver VMOptionWarning Experimental
*/
/* @test VMOptionWarningDiagnostic
* @bug 8027314
* @summary Warn if diagnostic vm option is used and -XX:+UnlockDiagnosticVMOptions isn't specified.
* @requires vm.flagless
* @requires ! vm.debug
* @library /test/lib
* @modules java.base/jdk.internal.misc
* java.management
* @run driver VMOptionWarning Diagnostic
*/
/* @test VMOptionWarningDevelop
* @bug 8027314
* @summary Warn if develop vm option is used with product version of VM.
* @requires vm.flagless
* @requires ! vm.debug
* @library /test/lib
* @modules java.base/jdk.internal.misc
* java.management
* @run driver VMOptionWarning Develop
*/
import jdk.test.lib.process.ProcessTools;
@ -38,24 +61,37 @@ import jdk.test.lib.Platform;
public class VMOptionWarning {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+AlwaysSafeConstructors", "-version");
OutputAnalyzer output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'AlwaysSafeConstructors' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.");
if (Platform.isDebugBuild()) {
System.out.println("Skip the rest of the tests on debug builds since diagnostic, and develop options are available on debug builds.");
return;
if (args.length != 1) {
throw new RuntimeException("wrong number of args: " + args.length);
}
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+PrintInlining", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.");
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+VerifyStack", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'VerifyStack' is develop and is available only in debug version of VM.");
ProcessBuilder pb;
OutputAnalyzer output;
switch (args[0]) {
case "Experimental": {
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+AlwaysSafeConstructors", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'AlwaysSafeConstructors' is experimental and must be enabled via -XX:+UnlockExperimentalVMOptions.");
break;
}
case "Diagnostic": {
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+PrintInlining", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'PrintInlining' is diagnostic and must be enabled via -XX:+UnlockDiagnosticVMOptions.");
break;
}
case "Develop": {
pb = ProcessTools.createLimitedTestJavaProcessBuilder("-XX:+VerifyStack", "-version");
output = new OutputAnalyzer(pb.start());
output.shouldNotHaveExitValue(0);
output.shouldContain("Error: VM option 'VerifyStack' is develop and is available only in debug version of VM.");
break;
}
default: {
throw new RuntimeException("Invalid argument: " + args[0]);
}
}
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2022, 2023, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2022, 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
@ -31,6 +31,7 @@
* java.management
* @compile C.java
* @run driver Bad_NCDFE_Msg
*/
import java.io.File;
import jdk.test.lib.process.ProcessTools;

View File

@ -0,0 +1,50 @@
/*
* 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.
*/
/*
* @test
* @bug 8337622
* @summary (reflect) java.lang.Class componentType field not found.
* @library /test/lib
* @modules java.base/java.lang:open
* @run main ComponentTypeFieldTest
*/
import java.lang.reflect.Field;
import static jdk.test.lib.Asserts.*;
public class ComponentTypeFieldTest {
public static void main(String[] args) throws Exception {
Field f = Class.class.getDeclaredField("componentType");
f.setAccessible(true);
Object val = f.get(Runnable.class);
assertTrue(val == null);
System.out.println("val is " + val);
Object arrayVal = f.get(Integer[].class);
System.out.println("val is " + arrayVal);
String arrayValString = arrayVal.toString();
assertTrue(arrayValString.equals("class java.lang.Integer"));
}
}

View File

@ -375,7 +375,7 @@ java/awt/Modal/MultipleDialogs/MultipleDialogs3Test.java 8198665 macosx-all
java/awt/Modal/MultipleDialogs/MultipleDialogs4Test.java 8198665 macosx-all
java/awt/Modal/MultipleDialogs/MultipleDialogs5Test.java 8198665 macosx-all
java/awt/Mouse/EnterExitEvents/DragWindowOutOfFrameTest.java 8177326 macosx-all
java/awt/Mouse/EnterExitEvents/ResizingFrameTest.java 8005021 macosx-all
java/awt/Mouse/EnterExitEvents/ResizingFrameTest.java 8005021,8332158 macosx-all,linux-x64
java/awt/Mouse/EnterExitEvents/FullscreenEnterEventTest.java 8051455 macosx-all
java/awt/Mouse/MouseModifiersUnitTest/MouseModifiersUnitTest_Standard.java 7124407,8302787 macosx-all,windows-all
java/awt/Mouse/RemovedComponentMouseListener/RemovedComponentMouseListener.java 8157170 macosx-all
@ -470,6 +470,11 @@ sun/java2d/DirectX/OnScreenRenderingResizeTest/OnScreenRenderingResizeTest.java
java/awt/Window/8159168/SetShapeTest.java 8274106 macosx-aarch64
java/awt/image/multiresolution/MultiResolutionJOptionPaneIconTest.java 8274106 macosx-aarch64
# Wayland related
java/awt/FullScreen/FullscreenWindowProps/FullscreenWindowProps.java 8280991 linux-x64
java/awt/FullScreen/SetFullScreenTest.java 8332155 linux-x64
############################################################################
# jdk_beans
@ -611,7 +616,7 @@ com/sun/security/sasl/gsskerb/NoSecurityLayer.java 8039280 generic-
sun/security/provider/PolicyFile/GrantAllPermToExtWhenNoPolicy.java 8039280 generic-all
sun/security/provider/PolicyParser/PrincipalExpansionError.java 8039280 generic-all
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183,8333317 generic-all
sun/security/pkcs11/sslecc/ClientJSSEServerJSSE.java 8316183 linux-ppc64le
############################################################################

View File

@ -40,7 +40,7 @@ import java.util.zip.ZipInputStream;
* @bug 8226346
* @summary Check all output files for absolute path fragments
* @requires !vm.debug
* @run main AbsPathsInImage
* @run main/othervm -Xmx900m AbsPathsInImage
*/
public class AbsPathsInImage {

View File

@ -101,8 +101,10 @@ class InterruptHangTarg {
for (int ii = 0; ii < INTERRUPTS_EXPECTED; ii++) {
boolean wasInterrupted = false;
try {
// Give other thread a chance to interrupt
Thread.sleep(100);
// Give other thread a chance to interrupt. Normally only a very short
// sleep is needed, but we need to account for unexpected delays in
// the interrupt due to machine and network hiccups.
Thread.sleep(10*1000);
} catch (InterruptedException ee) {
answer++;
wasInterrupted = true;

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2020, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2020, 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
@ -25,36 +25,36 @@
* @test
* @bug 8251496
* @summary Tests for methods in Authenticator
* @run testng/othervm AuthenticatorTest
* @run junit AuthenticatorTest
*/
import com.sun.net.httpserver.Authenticator;
import com.sun.net.httpserver.BasicAuthenticator;
import com.sun.net.httpserver.HttpPrincipal;
import org.testng.annotations.Test;
import static org.testng.Assert.assertEquals;
import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals;
public class AuthenticatorTest {
@Test
public void testFailure() {
var failureResult = new Authenticator.Failure(666);
assertEquals(failureResult.getResponseCode(), 666);
assertEquals(666, failureResult.getResponseCode());
}
@Test
public void testRetry() {
var retryResult = new Authenticator.Retry(333);
assertEquals(retryResult.getResponseCode(), 333);
assertEquals(333, retryResult.getResponseCode());
}
@Test
public void TestSuccess() {
public void testSuccess() {
var principal = new HttpPrincipal("test", "123");
var successResult = new Authenticator.Success(principal);
assertEquals(successResult.getPrincipal(), principal);
assertEquals("test", principal.getName());
assertEquals(principal, successResult.getPrincipal());
assertEquals("test", principal.getUsername());
assertEquals("123", principal.getRealm());
}
}

View File

@ -50,7 +50,7 @@ import jtreg.SkippedException;
public class MaximizeUndecoratedTest {
private static final int SIZE = 300;
private static final int OFFSET = 2;
private static final int OFFSET = 5;
private static Frame frame;
private static Robot robot;

View File

@ -24,6 +24,7 @@
import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
@ -44,6 +45,7 @@ import java.awt.image.RenderedImage;
import java.io.File;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
@ -69,6 +71,7 @@ import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;
import javax.swing.Timer;
import javax.swing.border.Border;
import javax.swing.text.JTextComponent;
import javax.swing.text.html.HTMLEditorKit;
import javax.swing.text.html.StyleSheet;
@ -79,15 +82,77 @@ import static javax.swing.SwingUtilities.invokeAndWait;
import static javax.swing.SwingUtilities.isEventDispatchThread;
/**
* Provides a framework for manual tests to display test instructions and
* Pass/Fail buttons.
* A framework for manual tests to display test instructions and
* <i>Pass</i> / <i>Fail</i> buttons. The framework automatically
* creates a frame to display the instructions, provides buttons
* to select the test result, and handles test timeout.
*
* <p id="timeOutTimer">
* The instruction UI frame displays a timer at the top which indicates
* how much time is left. The timer can be paused using the <i>Pause</i>
* button to the right of the time; the title of the button changes to
* <i>Resume</i>. To resume the timer, use the <i>Resume</i> button.
*
* <p id="instructionText">
* In the center, the instruction UI frame displays instructions for the
* tester. The instructions can be either plain text or HTML. If the
* text of the instructions starts with {@code "<html>"}, the
* instructions are displayed as HTML, as supported by Swing, which
* provides richer formatting options.
* <p>
* Instructions for the user can be either plain text or HTML as supported
* by Swing. If the instructions start with {@code <html>}, the
* instructions are displayed as HTML.
* The instructions are displayed in a text component with word-wrapping
* so that there's no horizontal scroll bar. If the text doesn't fit, a
* vertical scroll bar is shown. Use {@code rows} and {@code columns}
* parameters to change the size of this text component.
* If possible, choose the number of rows and columns so that
* the instructions fit and no scroll bars are shown.
*
* <p id="passFailButtons">
* At the bottom, the instruction UI frame displays the
* <i>Pass</i> and <i>Fail</i> buttons. The tester clicks either <i>Pass</i>
* or <i>Fail</i> button to finish the test. When the tester clicks the
* <i>Fail</i> button, the framework displays a dialog box prompting for
* a reason why the test fails. The tester enters the reason and clicks
* <i>OK</i> to close the dialog and fail the test,
* or simply closes the dialog to fail the test without providing any reason.
*
* <p id="screenCapture">
* If you enable the screenshot feature, a <i>Screenshot</i> button is
* added to the right of the <i>Fail</i> button. The tester can choose either
* <i>Capture Full Screen</i> (default) or <i>Capture Frames</i> and click the
* <i>Screenshot</i> button to take a screenshot.
* If there are multiple screens, screenshots of each screen are created.
* If the tester selects the <i>Capture Frames</i> mode, screenshots of all
* the windows or frames registered in the {@code PassFailJFrame} framework
* are created.
*
* <p id="logArea">
* If you enable a log area, the instruction UI frame adds a text component
* to display log messages below the buttons.
* Use {@link #log(String) log}, {@link #logSet(String) logSet}
* and {@link #logClear() logClear} static methods of {@code PassFailJFrame}
* to add or clear messages from the log area.
*
* <p id="awaitTestResult">
* After you create an instance of {@code PassFailJFrame}, call the
* {@link #awaitAndCheck() awaitAndCheck} method to stop the current thread
* (usually the main thread) and wait until the tester clicks
* either <i>Pass</i> or <i>Fail</i> button,
* or until the test times out.
* <p>
* The call to the {@code awaitAndCheck} method is usually the last
* statement in the {@code main} method of your test.
* If the test fails, an exception is thrown to signal the failure to jtreg.
* The test fails if the tester clicks the <i>Fail</i> button,
* if the timeout occurs,
* or if any window or frame is closed.
* <p>
* Before returning from {@code awaitAndCheck}, the framework disposes of
* all the windows and frames.
*
* <h2 id="sampleManualTest">Sample Manual Test</h2>
* A simple test would look like this:
* <pre>{@code
* {@snippet id='sampleManualTestCode' lang='java':
* public class SampleManualTest {
* private static final String INSTRUCTIONS =
* "Click Pass, or click Fail if the test failed.";
@ -95,7 +160,7 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
* public static void main(String[] args) throws Exception {
* PassFailJFrame.builder()
* .instructions(INSTRUCTIONS)
* .testUI(() -> createTestUI())
* .testUI(SampleManualTest::createTestUI)
* .build()
* .awaitAndCheck();
* }
@ -106,39 +171,87 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
* return testUI;
* }
* }
* }</pre>
* }
* <p>
* The above example uses the {@link Builder Builder} to set the parameters of
* the instruction frame. It is the recommended way.
* The above example uses the {@link Builder Builder} class to set
* the parameters of the instruction frame.
* It is <em>the recommended way</em>.
*
* <p>
* The framework will create instruction UI, it will call
* the provided {@code createTestUI} on the Event Dispatch Thread (EDT),
* and it will automatically position the test UI and make it visible.
* The framework will create an instruction UI frame, it will call
* the provided {@code createTestUI} on the Event Dispatch Thread (<dfn>EDT</dfn>),
* and it will automatically position the test UI frame and make it visible.
*
* <p id="jtregTagsForTest">
* Add the following jtreg tags before the test class declaration
* {@snippet :
* /*
* * @test
* * @summary Sample manual test
* * @library /java/awt/regtesthelpers
* * @build PassFailJFrame
* * @run main/manual SampleManualTest
* }
* and the closing comment tag <code>*&#47;</code>.
* <p>
* The {@code @library} tag points to the location of the
* {@code PassFailJFrame} class in the source code;
* the {@code @build} tag makes jtreg compile the {@code PassFailJFrame} class,
* and finally the {@code @run} tag specifies it is a manual
* test and the class to run.
*
* <h2 id="usingBuilder">Using {@code Builder}</h2>
* Use methods of the {@link Builder Builder} class to set or change
* parameters of {@code PassFailJFrame} and its instruction UI:
* <ul>
* <li>{@link Builder#title(String) title} sets
* the title of the instruction UI
* (the default is {@value #TITLE});</li>
* <li>{@link Builder#testTimeOut(long) testTimeOut} sets
* the timeout of the test
* (the default is {@value #TEST_TIMEOUT});</li>
* <li>{@link Builder#rows(int) rows} and
* {@link Builder#columns(int) columns} control the size
* the text component which displays the instructions
* (the default number of rows is the number of lines in the text
* of the instructions,
* the default number of columns is {@value #COLUMNS});</li>
* <li>{@link Builder#logArea() logArea} adds a log area;</li>
* <li>{@link Builder#screenCapture() screenCapture}
* enables screenshots.</li>
* </ul>
*
* <h3 id="builderTestUI">Using {@code testUI} and {@code splitUI}</h3>
* The {@code Builder.testUI} methods accept interfaces which create one window
* or a list of windows if the test needs multiple windows,
* or directly a single window, an array of windows or a list of windows.
* <p>
* For simple test UI, use {@code Builder.splitUI}, or explicitly
* {@code Builder.splitUIRight} or {@code Builder.splitUIBottom} with
* a {@code PanelCreator}. The framework will call the provided
* {@code createUIPanel} to create the component with test UI and
* For simple test UI, use {@link Builder#splitUI(PanelCreator) splitUI},
* or explicitly
* {@link Builder#splitUIRight(PanelCreator) splitUIRight} or
* {@link Builder#splitUIBottom(PanelCreator) splitUIBottom} with
* a {@link PanelCreator PanelCreator}.
* The framework will call the provided
* {@code createUIPanel} method to create the component with test UI and
* will place it as the right or bottom component in a split pane
* along with instruction UI.
* <p>
* Note: <em>support for multiple windows is incomplete</em>.
*
* <h2 id="obsoleteSampleTest">Obsolete Sample Test</h2>
* Alternatively, use one of the {@code PassFailJFrame} constructors to
* create an object, then create secondary test UI, register it
* with {@code PassFailJFrame}, position it and make it visible.
* The following sample demonstrates it:
* <pre>{@code
* public class SampleOldManualTest {
* {@snippet id='obsoleteSampleTestCode' lang='java':
* public class ObsoleteManualTest {
* private static final String INSTRUCTIONS =
* "Click Pass, or click Fail if the test failed.";
*
* public static void main(String[] args) throws Exception {
* PassFailJFrame passFail = new PassFailJFrame(INSTRUCTIONS);
*
* SwingUtilities.invokeAndWait(() -> createTestUI());
* SwingUtilities.invokeAndWait(ObsoleteManualTest::createTestUI);
*
* passFail.awaitAndCheck();
* }
@ -151,31 +264,54 @@ import static javax.swing.SwingUtilities.isEventDispatchThread;
* testUI.setVisible(true);
* }
* }
* }</pre>
* }
* <p>
* Use methods of the {@code Builder} class or constructors of the
* {@code PassFailJFrame} class to control other parameters:
* <ul>
* <li>the title of the instruction UI,</li>
* <li>the timeout of the test,</li>
* <li>the size of the instruction UI via rows and columns, and</li>
* <li>to add a log area</li>,
* <li>to enable screenshots.</li>
* </ul>
* This sample uses {@link #PassFailJFrame(String) a constructor} of
* {@code PassFailJFrame} to create its instance,
* there are several overloads provided which allow changing other parameters.
* <p>
* When you use the constructors, you have to explicitly create
* your test UI window on EDT. After you create the window,
* you need to register it with the framework using
* {@link #addTestWindow(Window) addTestWindow}
* to ensure the window is disposed of when the test completes.
* Before showing the window, you have to call
* {@link #positionTestWindow(Window, Position) positionTestWindow}
* to position the test window near the instruction UI frame provided
* by the framework. And finally you have to explicitly show the test UI
* window by calling {@code setVisible(true)}.
* <p>
* To avoid the complexity, use the {@link Builder Builder} class
* which provides a streamlined way to configure and create an
* instance of {@code PassFailJFrame}.
* <p>
* Consider updating tests which use {@code PassFailJFrame} constructors to
* use the builder pattern.
*/
public final class PassFailJFrame {
private static final String TITLE = "Test Instruction Frame";
/** A default title for the instruction frame. */
private static final String TITLE = "Test Instructions";
/** A default test timeout. */
private static final long TEST_TIMEOUT = 5;
/** A default number of rows for displaying the test instructions. */
private static final int ROWS = 10;
/** A default number of columns for displaying the test instructions. */
private static final int COLUMNS = 40;
/**
* A gap between windows.
*/
public static final int WINDOW_GAP = 8;
/**
* Prefix for the user-provided failure reason.
*/
private static final String FAILURE_REASON = "Failure Reason:\n";
/**
* The failure reason message when the user didn't provide one.
* The failure reason message when the user doesn't provide one.
*/
private static final String EMPTY_REASON = "(no reason provided)";
@ -213,90 +349,172 @@ public final class PassFailJFrame {
public enum Position {HORIZONTAL, VERTICAL, TOP_LEFT_CORNER}
public PassFailJFrame(String instructions) throws InterruptedException,
InvocationTargetException {
/**
* Constructs a frame which displays test instructions and
* the <i>Pass</i> / <i>Fail</i> buttons with the given instructions, and
* the default timeout of {@value #TEST_TIMEOUT} minutes,
* the default title of {@value #TITLE} and
* the default values of {@value #ROWS} and {@value #COLUMNS}
* for rows and columns.
* <p>
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
* more details.
*
* @param instructions the instructions for the tester
*
* @throws InterruptedException if the current thread is interrupted
* while waiting for EDT to finish creating UI components
* @throws InvocationTargetException if an exception is thrown while
* creating UI components on EDT
*/
public PassFailJFrame(String instructions)
throws InterruptedException, InvocationTargetException {
this(instructions, TEST_TIMEOUT);
}
public PassFailJFrame(String instructions, long testTimeOut) throws
InterruptedException, InvocationTargetException {
/**
* Constructs a frame which displays test instructions and
* the <i>Pass</i> / <i>Fail</i> buttons
* with the given instructions and timeout as well as
* the default title of {@value #TITLE}
* and the default values of {@value #ROWS} and {@value #COLUMNS}
* for rows and columns.
* <p>
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
* more details.
*
* @param instructions the instructions for the tester
* @param testTimeOut the test timeout in minutes
*
* @throws InterruptedException if the current thread is interrupted
* while waiting for EDT to finish creating UI components
* @throws InvocationTargetException if an exception is thrown while
* creating UI components on EDT
*/
public PassFailJFrame(String instructions, long testTimeOut)
throws InterruptedException, InvocationTargetException {
this(TITLE, instructions, testTimeOut);
}
/**
* Constructs a frame which displays test instructions and
* the <i>Pass</i> / <i>Fail</i> buttons
* with the given title, instructions and timeout as well as
* the default values of {@value #ROWS} and {@value #COLUMNS}
* for rows and columns.
* The screenshot feature is not enabled, if you use this constructor.
* <p>
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
* more details.
*
* @param title the title of the instruction frame
* @param instructions the instructions for the tester
* @param testTimeOut the test timeout in minutes
*
* @throws InterruptedException if the current thread is interrupted
* while waiting for EDT to finish creating UI components
* @throws InvocationTargetException if an exception is thrown while
* creating UI components on EDT
*/
public PassFailJFrame(String title, String instructions,
long testTimeOut) throws InterruptedException,
InvocationTargetException {
long testTimeOut)
throws InterruptedException, InvocationTargetException {
this(title, instructions, testTimeOut, ROWS, COLUMNS);
}
/**
* Constructs a JFrame with a given title & serves as test instructional
* frame where the user follows the specified test instruction in order
* to test the test case & mark the test pass or fail. If the expected
* result is seen then the user click on the 'Pass' button else click
* on the 'Fail' button and the reason for the failure should be
* specified in the JDialog JTextArea.
* Constructs a frame which displays test instructions and
* the <i>Pass</i> / <i>Fail</i> buttons
* with the given title, instructions, timeout, number of rows and columns.
* The screenshot feature is not enabled, if you use this constructor.
* <p>
* See {@link #PassFailJFrame(String,String,long,int,int,boolean)} for
* more details.
*
* @param title title of the Frame.
* @param instructions the instruction for the tester on how to test
* and what is expected (pass) and what is not
* expected (fail).
* @param testTimeOut test timeout where time is specified in minutes.
* @param rows number of visible rows of the JTextArea where the
* instruction is show.
* @param columns Number of columns of the instructional
* JTextArea
* @throws InterruptedException exception thrown when thread is
* interrupted
* @param title the title of the instruction frame
* @param instructions the instructions for the tester
* @param testTimeOut the test timeout in minutes
* @param rows the number of rows for the text component
* which displays test instructions
* @param columns the number of columns for the text component
* which displays test instructions
*
* @throws InterruptedException if the current thread is interrupted
* while waiting for EDT to finish creating UI components
* @throws InvocationTargetException if an exception is thrown while
* creating the test instruction frame on
* EDT
* creating UI components on EDT
*/
public PassFailJFrame(String title, String instructions, long testTimeOut,
int rows, int columns) throws InterruptedException,
InvocationTargetException {
public PassFailJFrame(String title, String instructions,
long testTimeOut,
int rows, int columns)
throws InterruptedException, InvocationTargetException {
this(title, instructions, testTimeOut, rows, columns, false);
}
/**
* Constructs a JFrame with a given title & serves as test instructional
* frame where the user follows the specified test instruction in order
* to test the test case & mark the test pass or fail. If the expected
* result is seen then the user click on the 'Pass' button else click
* on the 'Fail' button and the reason for the failure should be
* specified in the JDialog JTextArea.
* Constructs a frame which displays test instructions and
* the <i>Pass</i> / <i>Fail</i> buttons
* as well as supporting UI components with the given title, instructions,
* timeout, number of rows and columns,
* and screen capture functionality.
* All the UI components are created on the EDT, so it is safe to call
* the constructor on the main thread.
* <p>
* The test instruction frame also provides a way for the tester to take
* a screenshot (full screen or individual frame) if this feature
* is enabled by passing {@code true} as {@code enableScreenCapture}
* parameter.
* After you create a test UI window, register the window using
* {@link #addTestWindow(Window) addTestWindow} for disposal, and
* position it close to the instruction frame using
* {@link #positionTestWindow(Window, Position) positionTestWindow}.
* As the last step, make your test UI window visible.
* <p>
* Call the {@link #awaitAndCheck() awaitAndCheck} method on the instance
* of {@code PassFailJFrame} when you set up the testing environment.
* <p>
* If the tester clicks the <i>Fail</i> button, a dialog prompting for
* a description of the problem is displayed, and then an exception
* is thrown which fails the test.
* If the tester clicks the <i>Pass</i> button, the test completes
* successfully.
* If the timeout occurs or the instruction frame is closed,
* the test fails.
* <p>
* The {@code rows} and {@code columns} parameters control
* the size of a text component which displays the instructions.
* The preferred size of the instructions is calculated by
* creating {@code new JTextArea(rows, columns)}.
* <p>
* If you enable screenshots by setting the {@code screenCapture}
* parameter to {@code true}, a <i>Screenshot</i> button is added.
* Clicking the <i>Screenshot</i> button takes screenshots of
* all the monitors or all the windows registered with
* {@code PassFailJFrame}.
*
* @param title title of the Frame.
* @param instructions the instruction for the tester on how to test
* and what is expected (pass) and what is not
* expected (fail).
* @param testTimeOut test timeout where time is specified in minutes.
* @param rows number of visible rows of the JTextArea where the
* instruction is show.
* @param columns Number of columns of the instructional
* JTextArea
* @param enableScreenCapture if set to true, 'Capture Screen' button & its
* associated UIs are added to test instruction
* frame
* @throws InterruptedException exception thrown when thread is
* interrupted
* @param title the title of the instruction frame
* @param instructions the instructions for the tester
* @param testTimeOut the test timeout in minutes
* @param rows the number of rows for the text component
* which displays test instructions
* @param columns the number of columns for the text component
* which displays test instructions
* @param screenCapture if set to {@code true}, enables screen capture
* functionality
*
* @throws InterruptedException if the current thread is interrupted
* while waiting for EDT to finish creating UI components
* @throws InvocationTargetException if an exception is thrown while
* creating the test instruction frame on
* EDT
* creating UI components on EDT
*
* @see JTextArea#JTextArea(int,int) JTextArea(int rows, int columns)
* @see Builder Builder
*/
public PassFailJFrame(String title, String instructions, long testTimeOut,
public PassFailJFrame(String title, String instructions,
long testTimeOut,
int rows, int columns,
boolean enableScreenCapture)
boolean screenCapture)
throws InterruptedException, InvocationTargetException {
invokeOnEDT(() -> createUI(title, instructions,
testTimeOut,
rows, columns,
enableScreenCapture));
screenCapture));
}
/**
@ -349,11 +567,9 @@ public final class PassFailJFrame {
builder.positionWindows
.positionTestWindows(unmodifiableList(builder.testWindows),
builder.instructionUIHandler));
} else if (builder.testWindows.size() == 1) {
} else {
Window window = builder.testWindows.get(0);
positionTestWindow(window, builder.position);
} else {
positionTestWindow(null, builder.position);
}
}
showAllWindows();
@ -448,6 +664,8 @@ public final class PassFailJFrame {
boolean addLogArea,
int logAreaRows) {
JPanel main = new JPanel(new BorderLayout());
main.setBorder(createFrameBorder());
timeoutHandlerPanel = new TimeoutHandlerPanel(testTimeOut);
main.add(timeoutHandlerPanel, BorderLayout.NORTH);
@ -456,7 +674,11 @@ public final class PassFailJFrame {
: configurePlainText(instructions, rows, columns);
text.setEditable(false);
main.add(new JScrollPane(text), BorderLayout.CENTER);
JPanel textPanel = new JPanel(new BorderLayout());
textPanel.setBorder(createEmptyBorder(GAP, 0, GAP, 0));
textPanel.add(new JScrollPane(text), BorderLayout.CENTER);
main.add(textPanel, BorderLayout.CENTER);
JButton btnPass = new JButton("Pass");
btnPass.addActionListener((e) -> {
@ -470,7 +692,8 @@ public final class PassFailJFrame {
timeoutHandlerPanel.stop();
});
JPanel buttonsPanel = new JPanel();
JPanel buttonsPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,
GAP, 0));
buttonsPanel.add(btnPass);
buttonsPanel.add(btnFail);
@ -481,10 +704,12 @@ public final class PassFailJFrame {
if (addLogArea) {
logArea = new JTextArea(logAreaRows, columns);
logArea.setEditable(false);
logArea.setBorder(createTextBorder());
Box buttonsLogPanel = Box.createVerticalBox();
buttonsLogPanel.add(buttonsPanel);
buttonsLogPanel.add(Box.createVerticalStrut(GAP));
buttonsLogPanel.add(new JScrollPane(logArea));
main.add(buttonsLogPanel, BorderLayout.SOUTH);
@ -502,7 +727,7 @@ public final class PassFailJFrame {
JTextArea text = new JTextArea(instructions, rows, columns);
text.setLineWrap(true);
text.setWrapStyleWord(true);
text.setBorder(createEmptyBorder(4, 4, 4, 4));
text.setBorder(createTextBorder());
return text;
}
@ -524,6 +749,29 @@ public final class PassFailJFrame {
return text;
}
/** A default gap between components. */
private static final int GAP = 4;
/**
* Creates a default border for frames or dialogs.
* It uses the default gap of {@value GAP}.
*
* @return the border for frames and dialogs
*/
private static Border createFrameBorder() {
return createEmptyBorder(GAP, GAP, GAP, GAP);
}
/**
* Creates a border set to text area.
* It uses the default gap of {@value GAP}.
*
* @return the border for text area
*/
private static Border createTextBorder() {
return createEmptyBorder(GAP, GAP, GAP, GAP);
}
/**
* Creates a test UI window.
@ -589,7 +837,7 @@ public final class PassFailJFrame {
* @param testWindows the list of test windows
* @param instructionUI information about the instruction frame
*/
void positionTestWindows(List<? extends Window> testWindows,
void positionTestWindows(List<Window> testWindows,
InstructionUI instructionUI);
}
@ -737,7 +985,7 @@ public final class PassFailJFrame {
private static JComponent createCapturePanel() {
JComboBox<CaptureType> screenShortType = new JComboBox<>(CaptureType.values());
JButton capture = new JButton("ScreenShot");
JButton capture = new JButton("Screenshot");
capture.addActionListener((e) ->
captureScreen((CaptureType) screenShortType.getSelectedItem()));
@ -749,7 +997,7 @@ public final class PassFailJFrame {
private enum CaptureType {
FULL_SCREEN("Capture Full Screen"),
WINDOWS("Capture Individual Frame");
WINDOWS("Capture Frames");
private final String type;
CaptureType(String type) {
@ -875,26 +1123,30 @@ public final class PassFailJFrame {
* Requests the description of the test failure reason from the tester.
*/
private static void requestFailureReason() {
final JDialog dialog = new JDialog(frame, "Test Failure ", true);
dialog.setTitle("Failure reason");
JPanel jPanel = new JPanel(new BorderLayout());
JTextArea jTextArea = new JTextArea(5, 20);
final JDialog dialog = new JDialog(frame, "Failure reason", true);
JTextArea reason = new JTextArea(5, 20);
reason.setBorder(createTextBorder());
JButton okButton = new JButton("OK");
okButton.addActionListener((ae) -> {
String text = jTextArea.getText();
String text = reason.getText();
setFailureReason(FAILURE_REASON
+ (!text.isEmpty() ? text : EMPTY_REASON));
dialog.setVisible(false);
});
jPanel.add(new JScrollPane(jTextArea), BorderLayout.CENTER);
JPanel okayBtnPanel = new JPanel();
JPanel okayBtnPanel = new JPanel(new FlowLayout(FlowLayout.CENTER,
GAP, 0));
okayBtnPanel.setBorder(createEmptyBorder(GAP, 0, 0, 0));
okayBtnPanel.add(okButton);
jPanel.add(okayBtnPanel, BorderLayout.SOUTH);
dialog.add(jPanel);
JPanel main = new JPanel(new BorderLayout());
main.setBorder(createFrameBorder());
main.add(new JScrollPane(reason), BorderLayout.CENTER);
main.add(okayBtnPanel, BorderLayout.SOUTH);
dialog.add(main);
dialog.setLocationRelativeTo(frame);
dialog.pack();
dialog.setVisible(true);
@ -927,13 +1179,13 @@ public final class PassFailJFrame {
switch (position) {
case HORIZONTAL:
int newX = ((screenSize.width / 2) - frame.getWidth());
int newX = (((screenSize.width + WINDOW_GAP) / 2) - frame.getWidth());
frame.setLocation((newX + screenInsets.left),
(frame.getY() + screenInsets.top));
break;
case VERTICAL:
int newY = ((screenSize.height / 2) - frame.getHeight());
int newY = (((screenSize.height + WINDOW_GAP) / 2) - frame.getHeight());
frame.setLocation((frame.getX() + screenInsets.left),
(newY + screenInsets.top));
break;
@ -981,13 +1233,13 @@ public final class PassFailJFrame {
switch (position) {
case HORIZONTAL:
case TOP_LEFT_CORNER:
testWindow.setLocation((frame.getX() + frame.getWidth() + 5),
testWindow.setLocation((frame.getX() + frame.getWidth() + WINDOW_GAP),
frame.getY());
break;
case VERTICAL:
testWindow.setLocation(frame.getX(),
(frame.getY() + frame.getHeight() + 5));
(frame.getY() + frame.getHeight() + WINDOW_GAP));
break;
}
}
@ -1113,9 +1365,10 @@ public final class PassFailJFrame {
/**
* Adds a {@code message} to the log area, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
* {@link Builder#logArea() logArea()} or
* {@link Builder#logArea(int) logArea(int)}.
*
* @param message to log
* @param message the message to log
*/
public static void log(String message) {
System.out.println("PassFailJFrame: " + message);
@ -1124,7 +1377,8 @@ public final class PassFailJFrame {
/**
* Clears the log area, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
* {@link Builder#logArea() logArea()} or
* {@link Builder#logArea(int) logArea(int)}.
*/
public static void logClear() {
System.out.println("\nPassFailJFrame: log cleared\n");
@ -1133,7 +1387,9 @@ public final class PassFailJFrame {
/**
* Replaces the log area content with provided {@code text}, if enabled by
* {@link Builder#logArea()} or {@link Builder#logArea(int)}.
* {@link Builder#logArea() logArea()} or
* {@link Builder#logArea(int) logArea(int)}.
*
* @param text new text for the log area
*/
public static void logSet(String text) {
@ -1286,6 +1542,7 @@ public final class PassFailJFrame {
return this;
}
/**
* Adds an implementation of {@link PositionWindows PositionWindows}
* which the framework will use to position multiple test UI windows.
@ -1309,6 +1566,77 @@ public final class PassFailJFrame {
return this;
}
/**
* Positions the test UI windows in a row to the right of
* the instruction frame. The top of the windows is aligned to
* that of the instruction frame.
*
* @return this builder
*/
public Builder positionTestUIRightRow() {
return position(Position.HORIZONTAL)
.positionTestUI(WindowLayouts::rightOneRow);
}
/**
* Positions the test UI windows in a column to the right of
* the instruction frame. The top of the first window is aligned to
* that of the instruction frame.
*
* @return this builder
*/
public Builder positionTestUIRightColumn() {
return position(Position.HORIZONTAL)
.positionTestUI(WindowLayouts::rightOneColumn);
}
/**
* Positions the test UI windows in a column to the right of
* the instruction frame centering the stack of the windows.
*
* @return this builder
*/
public Builder positionTestUIRightColumnCentered() {
return position(Position.HORIZONTAL)
.positionTestUI(WindowLayouts::rightOneColumnCentered);
}
/**
* Positions the test UI windows in a row to the bottom of
* the instruction frame. The left of the first window is aligned to
* that of the instruction frame.
*
* @return this builder
*/
public Builder positionTestUIBottomRow() {
return position(Position.VERTICAL)
.positionTestUI(WindowLayouts::bottomOneRow);
}
/**
* Positions the test UI windows in a row to the bottom of
* the instruction frame centering the row of the windows.
*
* @return this builder
*/
public Builder positionTestUIBottomRowCentered() {
return position(Position.VERTICAL)
.positionTestUI(WindowLayouts::bottomOneRowCentered);
}
/**
* Positions the test UI windows in a column to the bottom of
* the instruction frame. The left of the first window is aligned to
* that of the instruction frame.
*
* @return this builder
*/
public Builder positionTestUIBottomColumn() {
return position(Position.VERTICAL)
.positionTestUI(WindowLayouts::bottomOneColumn);
}
/**
* Adds a {@code WindowListCreator} which the framework will use
* to create a list of test UI windows.
@ -1411,6 +1739,7 @@ public final class PassFailJFrame {
return this;
}
/**
* Adds a {@code PanelCreator} which the framework will use
* to create a component with test UI and display it in a split pane.
@ -1502,9 +1831,41 @@ public final class PassFailJFrame {
return new PassFailJFrame(this);
}
/**
* Returns the file name of the test, if the {@code test.file} property
* is defined, concatenated with {@code " - "} which serves as a prefix
* to the default instruction frame title;
* or an empty string if the {@code test.file} property is not defined.
*
* @return the prefix to the default title:
* either the file name of the test or an empty string
*
* @see <a href="https://openjdk.org/jtreg/tag-spec.html#testvars">jtreg
* test-specific system properties and environment variables</a>
*/
private static String getTestFileNamePrefix() {
String testFile = System.getProperty("test.file");
if (testFile == null) {
return "";
}
return Paths.get(testFile).getFileName().toString()
+ " - ";
}
/**
* Validates the state of the builder and
* expands parameters that have no assigned values
* to their default values.
*
* @throws IllegalStateException if no instructions are provided,
* or if {@code PositionWindows} implementation is
* provided but neither window creator nor
* test window list are set
*/
private void validate() {
if (title == null) {
title = TITLE;
title = getTestFileNamePrefix() + TITLE;
}
if (instructions == null || instructions.isEmpty()) {

View File

@ -0,0 +1,237 @@
/*
* Copyright (c) 2023, 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.
*/
import java.awt.Component;
import java.awt.Dimension;
import java.awt.GraphicsConfiguration;
import java.awt.Insets;
import java.awt.Point;
import java.awt.Window;
import java.util.List;
import static java.awt.GraphicsEnvironment.getLocalGraphicsEnvironment;
import static java.awt.Toolkit.getDefaultToolkit;
/**
* A utility class which provides standard window layouts for multi-window
* manual tests using the {@link PassFailJFrame} framework.
* The layout methods {@code right-} and {@code bottom-} implement the
* {@link PassFailJFrame.PositionWindows PositionWindows} interface and
* can be used directly or via builder methods.
* <p>
* There are several helper methods, such as
* {@link #getScreenCenter() getScreenCenter}, which could help you
* implement customized windows layouts.
*/
public final class WindowLayouts {
/** Private constructor to prevent instantiating the utility class. */
private WindowLayouts() {
}
/** A gap between windows. (Local copy makes expressions shorter.) */
private static final int WINDOW_GAP = PassFailJFrame.WINDOW_GAP;
/**
* Lays out the window list in one row to the right of
* the instruction frame. The top of the windows is aligned to
* that of the instruction frame.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void rightOneRow(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutRow(instructionUI.getLocation().x
+ instructionUI.getSize().width
+ WINDOW_GAP,
instructionUI.getLocation().y,
windows);
}
/**
* Lays out the window list in one column to the right of
* the instruction frame. The top of the first window is aligned to
* that of the instruction frame.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void rightOneColumn(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutColumn(instructionUI.getLocation().x
+ instructionUI.getSize().width
+ WINDOW_GAP,
instructionUI.getLocation().y,
windows);
}
/**
* Lays out the window list in one column to the right of
* the instruction frame centering the stack of the windows.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void rightOneColumnCentered(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutColumn(instructionUI.getLocation().x
+ instructionUI.getSize().width
+ WINDOW_GAP,
getScreenCenter().y
- getWindowListHeight(windows) / 2,
windows);
}
/**
* Lays out the window list in one row to the bottom of
* the instruction frame. The left of the first window is aligned to
* that of the instruction frame.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void bottomOneRow(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutRow(instructionUI.getLocation().x,
instructionUI.getLocation().y
+ instructionUI.getSize().height
+ WINDOW_GAP,
windows);
}
/**
* Lays out the window list in one row to the bottom of
* the instruction frame centering the row of the windows.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void bottomOneRowCentered(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutRow(getScreenCenter().x
- getWindowListWidth(windows) / 2,
instructionUI.getLocation().y
+ instructionUI.getSize().height
+ WINDOW_GAP,
windows);
}
/**
* Lays out the window list in one column to the bottom of
* the instruction frame. The left of the first window is aligned to
* that of the instruction frame.
*
* @param windows the list of windows to lay out
* @param instructionUI information about the instruction frame
*/
public static void bottomOneColumn(final List<Window> windows,
final PassFailJFrame.InstructionUI instructionUI) {
layoutColumn(instructionUI.getLocation().x,
instructionUI.getLocation().y
+ instructionUI.getSize().height
+ WINDOW_GAP,
windows);
}
/**
* Lays out the window list in one row starting at
* ({@code x0}, {@code y}).
*
* @param x0 the starting <var>x</var> coordinate of the windows
* @param y the <var>y</var> coordinate of the windows
* @param windows the list of windows to lay out
*/
public static void layoutRow(final int x0,
final int y,
final List<Window> windows) {
int x = x0;
for (Window w : windows) {
w.setLocation(x, y);
x += w.getWidth() + WINDOW_GAP;
}
}
/**
* Lays out the window list in one column starting at
* ({@code x}, {@code y0}).
*
* @param x the <var>x</var> coordinate of the windows
* @param y0 the starting <var>y</var> coordinate of the windows
* @param windows the list of windows to lay out
*/
public static void layoutColumn(final int x,
final int y0,
final List<Window> windows) {
int y = y0;
for (Window w : windows) {
w.setLocation(x, y);
y += w.getHeight() + WINDOW_GAP;
}
}
/**
* {@return the center point of the main screen}
*/
public static Point getScreenCenter() {
GraphicsConfiguration gc = getLocalGraphicsEnvironment()
.getDefaultScreenDevice()
.getDefaultConfiguration();
Dimension size = gc.getBounds()
.getSize();
Insets insets = getDefaultToolkit()
.getScreenInsets(gc);
return new Point((size.width - insets.left - insets.right) / 2,
(size.height - insets.top - insets.bottom) / 2);
}
/**
* {@return width of the windows in the list, taking into account
* the gap between windows}
*
* @param windows the list of windows to get the width of
*/
public static int getWindowListWidth(final List<Window> windows) {
return windows.stream()
.mapToInt(Component::getWidth)
.sum()
+ WINDOW_GAP * (windows.size() - 1);
}
/**
* {@return height of the windows in the list, taking into account
* the gap between windows}
*
* @param windows the list of windows to get the height of
*/
public static int getWindowListHeight(final List<Window> windows) {
return windows.stream()
.mapToInt(Component::getHeight)
.sum()
+ WINDOW_GAP * (windows.size() - 1);
}
}

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 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
@ -45,7 +45,7 @@ public class ReadXBytes {
private static final Random RND = RandomFactory.getRandom();
public static void main(String args[]) throws IOException {
File dir = new File(System.getProperty("test.src", "."));
File dir = new File(".");
dir.deleteOnExit();
File empty = File.createTempFile("foo", "bar", dir);

View File

@ -0,0 +1,70 @@
/*
* 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.
*/
import java.lang.invoke.MethodHandles;
import java.lang.invoke.VarHandle;
import java.util.ArrayList;
/**
* @test
* @bug 8340812
* @summary Verify that LambdaForm customization via MethodHandle::updateForm is thread safe.
* @run main TestLambdaFormCustomization
* @run main/othervm -Djava.lang.invoke.MethodHandle.CUSTOMIZE_THRESHOLD=0 TestLambdaFormCustomization
*/
public class TestLambdaFormCustomization {
String str = "test";
static final String value = "test" + 42;
// Trigger concurrent LambdaForm customization for VarHandle invokers
void test() throws NoSuchFieldException, IllegalAccessException {
VarHandle varHandle = MethodHandles.lookup().in(getClass()).findVarHandle(getClass(), "str", String.class);
ArrayList<Thread> threads = new ArrayList<>();
for (int threadIdx = 0; threadIdx < 10; threadIdx++) {
threads.add(new Thread(() -> {
for (int i = 0; i < 1000; i++) {
varHandle.compareAndExchange(this, value, value);
varHandle.compareAndExchange(this, value, value);
varHandle.compareAndExchange(this, value, value);
}
}));
}
threads.forEach(Thread::start);
threads.forEach(t -> {
try {
t.join();
} catch (Throwable e) {
throw new IllegalStateException(e);
}
});
}
public static void main(String[] args) throws Exception {
TestLambdaFormCustomization t = new TestLambdaFormCustomization();
for (int i = 0; i < 4000; ++i) {
t.test();
}
}
}

View File

@ -114,6 +114,9 @@ public class Lookup {
// Now check that a reverse lookup will succeed with the dual stack.
InetAddress ia = InetAddress.getByName(addr);
String name = ia.getHostName();
// output details of dual stack lookup by address
System.out.println("dual stack lookup for addr " + addr + " returned IP address " + ia);
System.out.println(" with hostname " + name);
System.out.println("(default) " + addr + "--> " + name
+ " (reversed IPv4: " + ipv4Reversed + ")");

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2003, 2016, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2003, 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
@ -123,7 +123,8 @@ public class Tests {
}
dprintln ("dest2 = " + dest2);
dprintln ("sender endpoint = " + s1.getLocalSocketAddress());
dprintln ("echo endpoint = " + s2.getLocalSocketAddress());
DatagramPacket r1 = new DatagramPacket (new byte[256], 256);
DatagramPacket r2 = new DatagramPacket (new byte[256], 256);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 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
@ -40,7 +40,7 @@ public class ForceException {
int numberOfBlocks = 200;
int fileLength = numberOfBlocks * blockSize;
File file = new File(System.getProperty("test.src", "."), "test.dat");
File file = new File(".", "test.dat");
file.deleteOnExit();
try (RandomAccessFile raf = new RandomAccessFile(file, "rw")) {
raf.setLength(fileLength);

View File

@ -1,5 +1,5 @@
/*
* Copyright (c) 2021, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2021, 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
@ -51,7 +51,7 @@ public class ForceViews {
@BeforeTest(alwaysRun=true)
public void openChannel() throws IOException {
Path file = Path.of(System.getProperty("test.src", "."), "junk");
Path file = Path.of(".", "junk");
fc = FileChannel.open(file, CREATE_NEW, READ, WRITE, DELETE_ON_CLOSE);
ByteBuffer buf = ByteBuffer.wrap(new byte[1024]);
fc.write(buf);

View File

@ -1,5 +1,6 @@
/*
* Copyright (c) 2013, 2024, Oracle and/or its affiliates. All rights reserved.
* Copyright (c) 2024 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
@ -25,18 +26,18 @@
* @bug 8011536 8151430 8316304 8334339
* @summary Basic test for creationTime attribute on platforms/file systems
* that support it, tests using /tmp directory.
* @library ../.. /test/lib
* @build jdk.test.lib.Platform
* @run main CreationTime
* @library ../.. /test/lib /java/foreign
* @build jdk.test.lib.Platform NativeTestHelper
* @run main/othervm/native --enable-native-access=ALL-UNNAMED CreationTime
*/
/* @test id=cwd
* @summary Basic test for creationTime attribute on platforms/file systems
* that support it, tests using the test scratch directory, the test
* scratch directory maybe at diff disk partition to /tmp on linux.
* @library ../.. /test/lib
* @build jdk.test.lib.Platform
* @run main CreationTime .
* @library ../.. /test/lib /java/foreign
* @build jdk.test.lib.Platform NativeTestHelper
* @run main/othervm/native --enable-native-access=ALL-UNNAMED CreationTime .
*/
import java.lang.foreign.Linker;
@ -51,8 +52,6 @@ import jtreg.SkippedException;
public class CreationTime {
private static final java.io.PrintStream err = System.err;
/**
* Reads the creationTime attribute
*/
@ -78,14 +77,9 @@ public class CreationTime {
FileTime creationTime = creationTime(file);
Instant now = Instant.now();
if (Math.abs(creationTime.toMillis()-now.toEpochMilli()) > 10000L) {
System.out.println("creationTime.toMillis() == " + creationTime.toMillis());
// If the file system doesn't support birth time, then skip this test
if (creationTime.toMillis() == 0) {
throw new SkippedException("birth time not support for: " + file);
} else {
err.println("File creation time reported as: " + creationTime);
throw new RuntimeException("Expected to be close to: " + now);
}
System.err.println("creationTime.toMillis() == " + creationTime.toMillis());
System.err.println("File creation time reported as: " + creationTime);
throw new RuntimeException("Expected to be close to: " + now);
}
/**
@ -107,7 +101,12 @@ public class CreationTime {
}
} else if (Platform.isLinux()) {
// Creation time read depends on statx system call support
supportsCreationTimeRead = Linker.nativeLinker().defaultLookup().find("statx").isPresent();
try {
supportsCreationTimeRead = CreationTimeHelper.
linuxIsCreationTimeSupported(file.toAbsolutePath().toString());
} catch (Throwable e) {
supportsCreationTimeRead = false;
}
// Creation time updates are not supported on Linux
supportsCreationTimeWrite = false;
}
@ -122,8 +121,11 @@ public class CreationTime {
Instant plusHour = Instant.now().plusSeconds(60L * 60L);
Files.setLastModifiedTime(file, FileTime.from(plusHour));
FileTime current = creationTime(file);
if (!current.equals(creationTime))
if (!current.equals(creationTime)) {
System.err.println("current = " + current);
System.err.println("creationTime = " + creationTime);
throw new RuntimeException("Creation time should not have changed");
}
}
/**

View File

@ -0,0 +1,61 @@
/*
* Copyright (c) 2024 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.
*/
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.lang.invoke.MethodHandle;
public class CreationTimeHelper extends NativeTestHelper {
static {
System.loadLibrary("CreationTimeHelper");
}
final static Linker abi = Linker.nativeLinker();
static final SymbolLookup lookup = SymbolLookup.loaderLookup();
final static MethodHandle methodHandle = abi.
downcallHandle(lookup.findOrThrow("linuxIsCreationTimeSupported"),
FunctionDescriptor.of(C_BOOL, C_POINTER));
// Helper so as to determine birth time support or not on Linux.
// Support is determined in a two-step process:
// 1. Determine if `statx` system call is available. If available proceed,
// otherwise return false.
// 2. Perform an actual `statx` call on the given file and check for birth
// time support in the mask returned from the call. This is needed,
// since some file systems, like nfs/tmpfs etc., don't support birth
// time even though the `statx` system call is available.
static boolean linuxIsCreationTimeSupported(String file) throws Throwable {
if (!abi.defaultLookup().find("statx").isPresent()) {
return false;
}
try (var arena = Arena.ofConfined()) {
MemorySegment s = arena.allocateFrom(file);
return (boolean)methodHandle.invokeExact(s);
}
}
}

View File

@ -0,0 +1,129 @@
/*
* Copyright (c) 2024 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.
*/
#include "export.h"
#include <stdbool.h>
#if defined(__linux__)
#include <stdio.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dlfcn.h>
#ifndef STATX_BASIC_STATS
#define STATX_BASIC_STATS 0x000007ffU
#endif
#ifndef STATX_BTIME
#define STATX_BTIME 0x00000800U
#endif
#ifndef RTLD_DEFAULT
#define RTLD_DEFAULT RTLD_LOCAL
#endif
#ifndef AT_SYMLINK_NOFOLLOW
#define AT_SYMLINK_NOFOLLOW 0x100
#endif
#ifndef AT_FDCWD
#define AT_FDCWD -100
#endif
#ifndef __GLIBC__
// Alpine doesn't know these types, define them
typedef unsigned int __uint32_t;
typedef unsigned short __uint16_t;
typedef unsigned long int __uint64_t;
#endif
/*
* Timestamp structure for the timestamps in struct statx.
*/
struct my_statx_timestamp {
int64_t tv_sec;
__uint32_t tv_nsec;
int32_t __reserved;
};
/*
* struct statx used by statx system call on >= glibc 2.28
* systems
*/
struct my_statx
{
__uint32_t stx_mask;
__uint32_t stx_blksize;
__uint64_t stx_attributes;
__uint32_t stx_nlink;
__uint32_t stx_uid;
__uint32_t stx_gid;
__uint16_t stx_mode;
__uint16_t __statx_pad1[1];
__uint64_t stx_ino;
__uint64_t stx_size;
__uint64_t stx_blocks;
__uint64_t stx_attributes_mask;
struct my_statx_timestamp stx_atime;
struct my_statx_timestamp stx_btime;
struct my_statx_timestamp stx_ctime;
struct my_statx_timestamp stx_mtime;
__uint32_t stx_rdev_major;
__uint32_t stx_rdev_minor;
__uint32_t stx_dev_major;
__uint32_t stx_dev_minor;
__uint64_t __statx_pad2[14];
};
typedef int statx_func(int dirfd, const char *restrict pathname, int flags,
unsigned int mask, struct my_statx *restrict statxbuf);
static statx_func* my_statx_func = NULL;
#endif //#defined(__linux__)
// static boolean linuxIsCreationTimeSupported(char* file)
EXPORT bool linuxIsCreationTimeSupported(char* file) {
#if defined(__linux__)
struct my_statx stx = {0};
int ret, atflag = AT_SYMLINK_NOFOLLOW;
unsigned int mask = STATX_BASIC_STATS | STATX_BTIME;
my_statx_func = (statx_func*) dlsym(RTLD_DEFAULT, "statx");
if (my_statx_func == NULL) {
return false;
}
if (file == NULL) {
printf("input file error!\n");
return false;
}
ret = my_statx_func(AT_FDCWD, file, atflag, mask, &stx);
if (ret != 0) {
return false;
}
// On some systems where statx is available but birth time might still not
// be supported as it's file system specific. The only reliable way to
// check for supported or not is looking at the filled in STATX_BTIME bit
// in the returned statx buffer mask.
if ((stx.stx_mask & STATX_BTIME) != 0)
return true;
return false;
#else
return false;
#endif
}

View File

@ -75,7 +75,7 @@ public class TimeZoneNameTest
"N", "GMT", "GMT", "Greenwich Mean Time", "GMT", "Greenwich Mean Time",
"N", "Europe/London", "GMT", "Greenwich Mean Time", "BST", "British Summer Time",
"N", "Europe/Paris", "CET", "Central European Standard Time", "CEST", "Central European Summer Time",
"N", "WET", "WET", "GMT", "WEST", "GMT+01:00",
"N", "WET", "WET", "Western European Standard Time", "WEST", "Western European Summer Time",
"N", "Europe/Berlin", "CET", "Central European Standard Time", "CEST", "Central European Summer Time",
"N", "Asia/Jerusalem", "IST", "Israel Standard Time", "IDT", "Israel Daylight Time",
"N", "Europe/Helsinki", "EET", "Eastern European Standard Time", "EEST", "Eastern European Summer Time",

View File

@ -31,7 +31,7 @@
* java.base/sun.util.resources
* @build com.foobar.Utils
* com.foo.*
* @run main/othervm -Djava.locale.providers=CLDR,SPI DateFormatProviderTest
* @run main/othervm/timeout=300 -Djava.locale.providers=CLDR,SPI DateFormatProviderTest
*/
import java.text.DateFormat;

View File

@ -1 +1 @@
tzdata2024a
tzdata2024b

Some files were not shown because too many files have changed in this diff Show More