From 39939d8cb98f08949e0a9b01942a181702d93548 Mon Sep 17 00:00:00 2001 From: wulongyao Date: Fri, 13 Jun 2025 11:05:22 +0800 Subject: [PATCH] add CompileCommand-support-dontprediction.patch --- CompileCommand-support-dontprediction.patch | 225 ++++++++++++++++++++ openjdk-17.spec | 7 +- 2 files changed, 231 insertions(+), 1 deletion(-) create mode 100644 CompileCommand-support-dontprediction.patch diff --git a/CompileCommand-support-dontprediction.patch b/CompileCommand-support-dontprediction.patch new file mode 100644 index 0000000..ad80bd9 --- /dev/null +++ b/CompileCommand-support-dontprediction.patch @@ -0,0 +1,225 @@ +From 355fcc6265c005ecc0300ecc13d45d0f7bb49f69 Mon Sep 17 00:00:00 2001 +Date: Fri, 13 Jun 2025 10:42:10 +0800 +Subject: CompileCommand support dontprediction + +--- + src/hotspot/share/compiler/compilerOracle.cpp | 4 ++++ + src/hotspot/share/compiler/compilerOracle.hpp | 4 ++++ + src/hotspot/share/jfr/metadata/metadata.xml | 1 + + src/hotspot/share/jfr/periodic/jfrPeriodic.cpp | 1 + + src/hotspot/share/opto/parse2.cpp | 7 +++++++ + src/jdk.jfr/share/classes/jdk/jfr/Recording.java | 8 ++++++++ + .../share/classes/jdk/jfr/consumer/RecordingStream.java | 1 + + .../share/classes/jdk/jfr/internal/PlatformRecorder.java | 6 +++--- + .../classes/jdk/jfr/internal/PlatformRecording.java | 9 +++++++++ + .../share/classes/jdk/jfr/internal/dcmd/DCmdStart.java | 9 +++++++-- + 10 files changed, 45 insertions(+), 5 deletions(-) + +diff --git a/src/hotspot/share/compiler/compilerOracle.cpp b/src/hotspot/share/compiler/compilerOracle.cpp +index 7ebecc152..dc7448b19 100644 +--- a/src/hotspot/share/compiler/compilerOracle.cpp ++++ b/src/hotspot/share/compiler/compilerOracle.cpp +@@ -400,6 +400,10 @@ bool CompilerOracle::should_inline(const methodHandle& method) { + return (check_predicate(CompileCommand::Inline, method)); + } + ++bool CompilerOracle::should_not_prediction(const methodHandle& method) { ++ return (check_predicate(CompileCommand::DontPrediction, method)); ++} ++ + bool CompilerOracle::should_not_inline(const methodHandle& method) { + return check_predicate(CompileCommand::DontInline, method) || check_predicate(CompileCommand::Exclude, method); + } +diff --git a/src/hotspot/share/compiler/compilerOracle.hpp b/src/hotspot/share/compiler/compilerOracle.hpp +index 858e5c794..4ed40475b 100644 +--- a/src/hotspot/share/compiler/compilerOracle.hpp ++++ b/src/hotspot/share/compiler/compilerOracle.hpp +@@ -86,6 +86,7 @@ class methodHandle; + option(CloneMapDebug, "CloneMapDebug", Bool) \ + option(IncrementalInlineForceCleanup, "IncrementalInlineForceCleanup", Bool) \ + option(MaxNodeLimit, "MaxNodeLimit", Intx) \ ++ option(DontPrediction, "dontprediction", Bool) \ + NOT_PRODUCT(option(TestOptionInt, "TestOptionInt", Intx)) \ + NOT_PRODUCT(option(TestOptionUint, "TestOptionUint", Uintx)) \ + NOT_PRODUCT(option(TestOptionBool, "TestOptionBool", Bool)) \ +@@ -151,6 +152,9 @@ class CompilerOracle : AllStatic { + // A wrapper for checking bool options + static bool has_option(const methodHandle& method, enum CompileCommand option); + ++ // A wrapper for checking prediction option ++ static bool should_not_prediction(const methodHandle& method); ++ + // Check if method has option and value set. If yes, overwrite value and return true, + // otherwise leave value unchanged and return false. + template +diff --git a/src/hotspot/share/jfr/metadata/metadata.xml b/src/hotspot/share/jfr/metadata/metadata.xml +index 40bfa103b..82512fc65 100644 +--- a/src/hotspot/share/jfr/metadata/metadata.xml ++++ b/src/hotspot/share/jfr/metadata/metadata.xml +@@ -899,6 +899,7 @@ + + + ++ + + + +diff --git a/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp b/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp +index ba30adc9e..b0a0380ea 100644 +--- a/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp ++++ b/src/hotspot/share/jfr/periodic/jfrPeriodic.cpp +@@ -571,6 +571,7 @@ TRACE_REQUEST_FUNC(CompilerStatistics) { + event.set_bailoutCount(CompileBroker::get_total_bailout_count()); + event.set_invalidatedCount(CompileBroker::get_total_invalidated_count()); + event.set_osrCompileCount(CompileBroker::get_total_osr_compile_count()); ++ event.set_deoptimizationCount(Deoptimization::total_deoptimization_count()); + event.set_standardCompileCount(CompileBroker::get_total_standard_compile_count()); + event.set_osrBytesCompiled(CompileBroker::get_sum_osr_bytes_compiled()); + event.set_standardBytesCompiled(CompileBroker::get_sum_standard_bytes_compiled()); +diff --git a/src/hotspot/share/opto/parse2.cpp b/src/hotspot/share/opto/parse2.cpp +index 2412a0442..cfe675444 100644 +--- a/src/hotspot/share/opto/parse2.cpp ++++ b/src/hotspot/share/opto/parse2.cpp +@@ -25,6 +25,7 @@ + #include "precompiled.hpp" + #include "jvm_io.h" + #include "ci/ciMethodData.hpp" ++#include "ci/ciUtilities.inline.hpp" + #include "classfile/vmSymbols.hpp" + #include "compiler/compileLog.hpp" + #include "interpreter/linkResolver.hpp" +@@ -1300,6 +1301,12 @@ float Parse::branch_prediction(float& cnt, + BoolTest::mask btest, + int target_bci, + Node* test) { ++ { ++ VM_ENTRY_MARK ++ methodHandle mh(THREAD, _method->get_Method()); ++ if (CompilerOracle::should_not_prediction(mh)) return PROB_FAIR; ++ } ++ + float prob = dynamic_branch_prediction(cnt, btest, test); + // If prob is unknown, switch to static prediction + if (prob != PROB_UNKNOWN) return prob; +diff --git a/src/jdk.jfr/share/classes/jdk/jfr/Recording.java b/src/jdk.jfr/share/classes/jdk/jfr/Recording.java +index 71ef9cebc..f47a2929f 100644 +--- a/src/jdk.jfr/share/classes/jdk/jfr/Recording.java ++++ b/src/jdk.jfr/share/classes/jdk/jfr/Recording.java +@@ -631,6 +631,14 @@ public final class Recording implements Closeable { + internal.setDuration(duration); + } + ++ public void setPreRecord(long pre) { ++ internal.setPreRecord(pre); ++ } ++ ++ public long getPreRecord() { ++ return internal.getPreRecord(); ++ } ++ + /** + * Enables the event with the specified name. + *

+diff --git a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingStream.java b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingStream.java +index ea6d2a05b..2782d22bb 100644 +--- a/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingStream.java ++++ b/src/jdk.jfr/share/classes/jdk/jfr/consumer/RecordingStream.java +@@ -109,6 +109,7 @@ public final class RecordingStream implements AutoCloseable, EventStream { + AccessControlContext acc = AccessController.getContext(); + this.recording = new Recording(); + this.creationTime = Instant.now(); ++ this.recording.setPreRecord(-1); + this.recording.setName("Recording Stream: " + creationTime); + try { + PlatformRecording pr = PrivateAccess.getInstance().getPlatformRecording(recording); +diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java +index 6b1a4f0c8..691dbe3a4 100644 +--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java ++++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecorder.java +@@ -257,7 +257,7 @@ public final class PlatformRecorder { + } + recording.setState(RecordingState.RUNNING); + updateSettings(false); +- recording.setStartTime(startTime); ++ recording.setStartTime(startTime.plusNanos(recording.getPreRecord())); + writeMetaEvents(); + } else { + RepositoryChunk newChunk = null; +@@ -273,12 +273,12 @@ public final class PlatformRecorder { + } + startNanos = Utils.getChunkStartNanos(); + startTime = Utils.epochNanosToInstant(startNanos); +- recording.setStartTime(startTime); ++ recording.setStartTime(startTime.plusNanos(recording.getPreRecord())); + recording.setState(RecordingState.RUNNING); + updateSettings(false); + writeMetaEvents(); + if (currentChunk != null) { +- finishChunk(currentChunk, startTime, recording); ++ finishChunk(currentChunk, startTime, recording.getPreRecord() == 0 ? recording : null); + } + currentChunk = newChunk; + } +diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java +index 104e8bdbf..1f50fccd9 100644 +--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java ++++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/PlatformRecording.java +@@ -68,6 +68,7 @@ public final class PlatformRecording implements AutoCloseable { + private Duration duration; + private Duration maxAge; + private long maxSize; ++ private long preRecord; + + private WriteableUserPath destination; + +@@ -648,6 +649,14 @@ public final class PlatformRecording implements AutoCloseable { + } + } + ++ public void setPreRecord(long pre) { ++ this.preRecord = pre; ++ } ++ ++ public long getPreRecord() { ++ return preRecord; ++ } ++ + void updateTimer() { + if (stopTask != null) { + stopTask.cancel(); +diff --git a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java +index fd5713fe1..467f53030 100644 +--- a/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java ++++ b/src/jdk.jfr/share/classes/jdk/jfr/internal/dcmd/DCmdStart.java +@@ -116,7 +116,7 @@ final class DCmdStart extends AbstractDCmd { + } + + if (delay != null) { +- if (delay < 1000L * 1000L * 1000L) { ++ if (delay >= 0 && delay < 1000L * 1000L * 1000L) { + // to avoid typo, delay shorter than 1s makes no sense. + throw new DCmdException("Could not start recording, delay must be at least 1 second."); + } +@@ -187,13 +187,18 @@ final class DCmdStart extends AbstractDCmd { + recording.setDumpOnExit(dumpOnExit); + } + +- if (delay != null) { ++ if (delay != null && delay >= 0) { + Duration dDelay = Duration.ofNanos(delay); + recording.scheduleStart(dDelay); + print("Recording " + recording.getId() + " scheduled to start in "); + printTimespan(dDelay, " "); + print("."); + } else { ++ if (delay != null && delay < 0) { ++ recording.setPreRecord(delay); ++ } else { ++ recording.setPreRecord(0); ++ } + recording.start(); + print("Started recording " + recording.getId() + "."); + } +-- +2.19.0 + diff --git a/openjdk-17.spec b/openjdk-17.spec index 7225066..7afba25 100644 --- a/openjdk-17.spec +++ b/openjdk-17.spec @@ -920,7 +920,7 @@ Provides: java-src%{?1} = %{epoch}:%{version}-%{release} Name: java-%{javaver}-%{origin} Version: %{newjavaver}.%{buildver} -Release: 4 +Release: 5 # java-1.5.0-ibm from jpackage.org set Epoch to 1 for unknown reasons # and this change was brought into RHEL-4. java-1.5.0-ibm packages @@ -1072,6 +1072,7 @@ Patch78: Fix-a-concurrent-issue-of-program-data-ref-cnt.patch Patch79: Huawei-fix-potential-build-fail-in-jbolt.patch Patch80: 8352716-tz-Update-Timezone-Data-to-2025b.patch Patch81: heapdump-bug-fix.patch +Patch82: CompileCommand-support-dontprediction.patch ############################################ # # LoongArch64 specific patches @@ -1372,6 +1373,7 @@ pushd %{top_level_dir_name} %patch 79 -p1 %patch 80 -p1 %patch 81 -p1 +%patch 82 -p1 popd # openjdk %endif @@ -1997,6 +1999,9 @@ cjc.mainProgram(args) -- the returns from copy_jdk_configs.lua should not affect %changelog +* Fri Jun 13 2025 wulongyao - 1:17.0.15.6-5 +- add CompileCommand-support-dontprediction.patch + * Sat May 17 2025 Benshuai5D - 1:17.0.15.6-4 - add heapdump-bug-fix.patch -- Gitee