#ifndef V8_EXECUTION_TIERING_MANAGER_H_
#define V8_EXECUTION_TIERING_MANAGER_H_
#include <optional>
#include "src/common/assert-scope.h"
#include "src/handles/handles.h"
#include "src/utils/allocation.h"
namespace v8 {
namespace internal {
class BytecodeArray;
class Isolate;
class JSFunction;
class OptimizationDecision;
enum class CodeKind : uint8_t;
enum class OptimizationReason : uint8_t;
void TraceManualRecompile(Tagged<JSFunction> function, CodeKind code_kind,
ConcurrencyMode concurrency_mode);
class TieringManager {
public:
explicit TieringManager(Isolate* isolate) : isolate_(isolate) {}
void OnInterruptTick(DirectHandle<JSFunction> function, CodeKind code_kind);
void NotifyICChanged(Tagged<FeedbackVector> vector);
void RequestOsrAtNextOpportunity(Tagged<JSFunction> function);
static int InterruptBudgetFor(
Isolate* isolate, Tagged<JSFunction> function,
std::optional<CodeKind> override_active_tier = {});
void MarkForTurboFanOptimization(Tagged<JSFunction> function);
private:
void MaybeOptimizeFrame(Tagged<JSFunction> function, CodeKind code_kind);
OptimizationDecision ShouldOptimize(Tagged<FeedbackVector> feedback_vector,
CodeKind code_kind);
void Optimize(Tagged<JSFunction> function, OptimizationDecision decision);
void Baseline(Tagged<JSFunction> function, OptimizationReason reason);
class V8_NODISCARD OnInterruptTickScope final {
public:
OnInterruptTickScope();
private:
DisallowGarbageCollection no_gc;
};
Isolate* const isolate_;
};
}
}
#endif