mirror of
https://github.com/JetBrains/JetBrainsRuntime.git
synced 2025-12-06 09:29:38 +01:00
8224980: FLAG_SET_ERGO silently ignores invalid values
Reviewed-by: iveresov, dholmes
(cherry picked from commit 573c316c57)
This commit is contained in:
@@ -1194,7 +1194,7 @@ void CodeCache::initialize() {
|
||||
initialize_heaps();
|
||||
} else {
|
||||
// Use a single code heap
|
||||
FLAG_SET_ERGO(NonNMethodCodeHeapSize, 0);
|
||||
FLAG_SET_ERGO(NonNMethodCodeHeapSize, (uintx)os::vm_page_size());
|
||||
FLAG_SET_ERGO(ProfiledCodeHeapSize, 0);
|
||||
FLAG_SET_ERGO(NonProfiledCodeHeapSize, 0);
|
||||
ReservedCodeSpace rs = reserve_heap_memory(ReservedCodeCacheSize);
|
||||
|
||||
@@ -123,6 +123,16 @@ intx CompilerConfig::scaled_freq_log(intx freq_log) {
|
||||
return scaled_freq_log(freq_log, CompileThresholdScaling);
|
||||
}
|
||||
|
||||
// For XXXThreshold flags, which all have a valid range of [0 .. max_jint]
|
||||
intx CompilerConfig::jvmflag_scaled_compile_threshold(intx threshold) {
|
||||
return MAX2((intx)0, MIN2(scaled_compile_threshold(threshold), (intx)max_jint));
|
||||
}
|
||||
|
||||
// For XXXNotifyFreqLog flags, which all have a valid range of [0 .. 30]
|
||||
intx CompilerConfig::jvmflag_scaled_freq_log(intx freq_log) {
|
||||
return MAX2((intx)0, MIN2(scaled_freq_log(freq_log), (intx)30));
|
||||
}
|
||||
|
||||
// Returns threshold scaled with the value of scale.
|
||||
// If scale < 0.0, threshold is returned without scaling.
|
||||
intx CompilerConfig::scaled_compile_threshold(intx threshold, double scale) {
|
||||
@@ -364,29 +374,29 @@ void CompilerConfig::set_compilation_policy_flags() {
|
||||
// Scale tiered compilation thresholds.
|
||||
// CompileThresholdScaling == 0.0 is equivalent to -Xint and leaves compilation thresholds unchanged.
|
||||
if (!FLAG_IS_DEFAULT(CompileThresholdScaling) && CompileThresholdScaling > 0.0) {
|
||||
FLAG_SET_ERGO(Tier0InvokeNotifyFreqLog, scaled_freq_log(Tier0InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier0BackedgeNotifyFreqLog, scaled_freq_log(Tier0BackedgeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier0InvokeNotifyFreqLog, jvmflag_scaled_freq_log(Tier0InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier0BackedgeNotifyFreqLog, jvmflag_scaled_freq_log(Tier0BackedgeNotifyFreqLog));
|
||||
|
||||
FLAG_SET_ERGO(Tier3InvocationThreshold, scaled_compile_threshold(Tier3InvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier3MinInvocationThreshold, scaled_compile_threshold(Tier3MinInvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier3CompileThreshold, scaled_compile_threshold(Tier3CompileThreshold));
|
||||
FLAG_SET_ERGO(Tier3BackEdgeThreshold, scaled_compile_threshold(Tier3BackEdgeThreshold));
|
||||
FLAG_SET_ERGO(Tier3InvocationThreshold, jvmflag_scaled_compile_threshold(Tier3InvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier3MinInvocationThreshold, jvmflag_scaled_compile_threshold(Tier3MinInvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier3CompileThreshold, jvmflag_scaled_compile_threshold(Tier3CompileThreshold));
|
||||
FLAG_SET_ERGO(Tier3BackEdgeThreshold, jvmflag_scaled_compile_threshold(Tier3BackEdgeThreshold));
|
||||
|
||||
// Tier2{Invocation,MinInvocation,Compile,Backedge}Threshold should be scaled here
|
||||
// once these thresholds become supported.
|
||||
|
||||
FLAG_SET_ERGO(Tier2InvokeNotifyFreqLog, scaled_freq_log(Tier2InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier2BackedgeNotifyFreqLog, scaled_freq_log(Tier2BackedgeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier2InvokeNotifyFreqLog, jvmflag_scaled_freq_log(Tier2InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier2BackedgeNotifyFreqLog, jvmflag_scaled_freq_log(Tier2BackedgeNotifyFreqLog));
|
||||
|
||||
FLAG_SET_ERGO(Tier3InvokeNotifyFreqLog, scaled_freq_log(Tier3InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier3BackedgeNotifyFreqLog, scaled_freq_log(Tier3BackedgeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier3InvokeNotifyFreqLog, jvmflag_scaled_freq_log(Tier3InvokeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier3BackedgeNotifyFreqLog, jvmflag_scaled_freq_log(Tier3BackedgeNotifyFreqLog));
|
||||
|
||||
FLAG_SET_ERGO(Tier23InlineeNotifyFreqLog, scaled_freq_log(Tier23InlineeNotifyFreqLog));
|
||||
FLAG_SET_ERGO(Tier23InlineeNotifyFreqLog, jvmflag_scaled_freq_log(Tier23InlineeNotifyFreqLog));
|
||||
|
||||
FLAG_SET_ERGO(Tier4InvocationThreshold, scaled_compile_threshold(Tier4InvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier4MinInvocationThreshold, scaled_compile_threshold(Tier4MinInvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier4CompileThreshold, scaled_compile_threshold(Tier4CompileThreshold));
|
||||
FLAG_SET_ERGO(Tier4BackEdgeThreshold, scaled_compile_threshold(Tier4BackEdgeThreshold));
|
||||
FLAG_SET_ERGO(Tier4InvocationThreshold, jvmflag_scaled_compile_threshold(Tier4InvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier4MinInvocationThreshold, jvmflag_scaled_compile_threshold(Tier4MinInvocationThreshold));
|
||||
FLAG_SET_ERGO(Tier4CompileThreshold, jvmflag_scaled_compile_threshold(Tier4CompileThreshold));
|
||||
FLAG_SET_ERGO(Tier4BackEdgeThreshold, jvmflag_scaled_compile_threshold(Tier4BackEdgeThreshold));
|
||||
}
|
||||
|
||||
#ifdef COMPILER1
|
||||
|
||||
@@ -121,10 +121,12 @@ public:
|
||||
// Returns threshold scaled with CompileThresholdScaling
|
||||
static intx scaled_compile_threshold(intx threshold, double scale);
|
||||
static intx scaled_compile_threshold(intx threshold);
|
||||
static intx jvmflag_scaled_compile_threshold(intx threshold);
|
||||
|
||||
// Returns freq_log scaled with CompileThresholdScaling
|
||||
static intx scaled_freq_log(intx freq_log, double scale);
|
||||
static intx scaled_freq_log(intx freq_log);
|
||||
static intx jvmflag_scaled_freq_log(intx freq_log);
|
||||
|
||||
static bool check_args_consistency(bool status);
|
||||
|
||||
|
||||
@@ -61,11 +61,15 @@ class TypedFlagAccessImpl : public FlagAccessImpl {
|
||||
|
||||
public:
|
||||
JVMFlag::Error check_constraint_and_set(JVMFlag* flag, void* value_addr, JVMFlagOrigin origin, bool verbose) const {
|
||||
verbose |= (origin == JVMFlagOrigin::ERGONOMIC);
|
||||
T value = *((T*)value_addr);
|
||||
const JVMTypedFlagLimit<T>* constraint = (const JVMTypedFlagLimit<T>*)JVMFlagLimit::get_constraint(flag);
|
||||
if (constraint != nullptr && constraint->phase() <= static_cast<int>(JVMFlagLimit::validating_phase())) {
|
||||
JVMFlag::Error err = typed_check_constraint(constraint->constraint_func(), value, verbose);
|
||||
if (err != JVMFlag::SUCCESS) {
|
||||
if (origin == JVMFlagOrigin::ERGONOMIC) {
|
||||
fatal("FLAG_SET_ERGO cannot be used to set an invalid value for %s", flag->name());
|
||||
}
|
||||
return err;
|
||||
}
|
||||
}
|
||||
@@ -104,12 +108,15 @@ class RangedFlagAccessImpl : public TypedFlagAccessImpl<T, EVENT> {
|
||||
public:
|
||||
virtual JVMFlag::Error set_impl(JVMFlag* flag, void* value_addr, JVMFlagOrigin origin) const {
|
||||
T value = *((T*)value_addr);
|
||||
bool verbose = JVMFlagLimit::verbose_checks_needed();
|
||||
bool verbose = JVMFlagLimit::verbose_checks_needed() | (origin == JVMFlagOrigin::ERGONOMIC);
|
||||
|
||||
const JVMTypedFlagLimit<T>* range = (const JVMTypedFlagLimit<T>*)JVMFlagLimit::get_range(flag);
|
||||
if (range != nullptr) {
|
||||
if ((value < range->min()) || (value > range->max())) {
|
||||
range_error(flag->name(), value, range->min(), range->max(), verbose);
|
||||
if (origin == JVMFlagOrigin::ERGONOMIC) {
|
||||
fatal("FLAG_SET_ERGO cannot be used to set an invalid value for %s", flag->name());
|
||||
}
|
||||
return JVMFlag::OUT_OF_BOUNDS;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright (c) 2003, 2022, Oracle and/or its affiliates. All rights reserved.
|
||||
* Copyright (c) 2003, 2023, Oracle and/or its affiliates. All rights reserved.
|
||||
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
|
||||
*
|
||||
* This code is free software; you can redistribute it and/or modify it
|
||||
@@ -86,9 +86,12 @@ ALL_FLAGS(DEFINE_FLAG_MEMBER_SETTER,
|
||||
|
||||
#define FLAG_SET_CMDLINE(name, value) (JVMFlag::setOnCmdLine(FLAG_MEMBER_ENUM(name)), \
|
||||
FLAG_MEMBER_SETTER(name)((value), JVMFlagOrigin::COMMAND_LINE))
|
||||
#define FLAG_SET_ERGO(name, value) (FLAG_MEMBER_SETTER(name)((value), JVMFlagOrigin::ERGONOMIC))
|
||||
#define FLAG_SET_MGMT(name, value) (FLAG_MEMBER_SETTER(name)((value), JVMFlagOrigin::MANAGEMENT))
|
||||
|
||||
// FLAG_SET_ERGO must be always be called with a valid value. If an invalid value
|
||||
// is detected then the VM will exit.
|
||||
#define FLAG_SET_ERGO(name, value) (void)(FLAG_MEMBER_SETTER(name)((value), JVMFlagOrigin::ERGONOMIC))
|
||||
|
||||
#define FLAG_SET_ERGO_IF_DEFAULT(name, value) \
|
||||
do { \
|
||||
if (FLAG_IS_DEFAULT(name)) { \
|
||||
|
||||
Reference in New Issue
Block a user