15#ifdef V8_ENABLE_MAGLEV
30constexpr char kMaglevZoneName[] =
"maglev-compilation-job-zone";
34 MaglevCompilationHandleScope(Isolate* isolate,
35 maglev::MaglevCompilationInfo* info)
38#ifdef V8_ENABLE_MAGLEV
43 info->ReopenAndCanonicalizeHandlesInNewScope(isolate);
46 ~MaglevCompilationHandleScope() {
51 maglev::MaglevCompilationInfo*
const info_;
53#ifdef V8_ENABLE_MAGLEV
54 ExportedMaglevCompilationInfo exported_info_;
58static bool SpecializeToFunctionContext(
59 Isolate* isolate, BytecodeOffset osr_offset,
60 DirectHandle<JSFunction> function,
61 std::optional<bool> specialize_to_function_context_override) {
63 if (!
v8_flags.maglev_function_context_specialization)
return false;
64 if (specialize_to_function_context_override.has_value()) {
65 return specialize_to_function_context_override.value();
67 if (function->shared()->function_context_independent_compiled()) {
70 return function->raw_feedback_cell()->map() ==
71 ReadOnlyRoots(isolate).one_closure_cell_map();
78 BytecodeOffset osr_offset, std::optional<compiler::JSHeapBroker*> js_broker,
79 std::optional<bool> specialize_to_function_context,
80 bool for_turboshaft_frontend)
81 :
zone_(isolate->allocator(), kMaglevZoneName),
84 : new compiler::JSHeapBroker(isolate, zone(),
87 toplevel_function_(function),
88 osr_offset_(osr_offset),
89 owns_broker_(!js_broker.has_value()),
90 is_turbolev_(for_turboshaft_frontend)
95 specialize_to_function_context_(SpecializeToFunctionContext(
96 isolate, osr_offset, function, specialize_to_function_context)) {
102 MaglevCompilationHandleScope compilation(isolate,
this);
111 isolate->heap()->PublishMainThreadPendingAllocations();
117 isolate->heap()->PublishMainThreadPendingAllocations();
140#ifdef V8_ENABLE_MAGLEV
141void MaglevCompilationInfo::set_code_generator(
142 std::unique_ptr<MaglevCodeGenerator> code_generator) {
143 code_generator_ = std::move(code_generator);
153 auto find_result = canonical_handles->
FindOrInsert(
object);
154 if (!find_result.already_exists) {
168 std::unique_ptr<PersistentHandles>&& persistent_handles) {
170 ph_ = std::move(persistent_handles);
174std::unique_ptr<PersistentHandles>
177 return std::move(
ph_);
181 std::unique_ptr<CanonicalHandlesMap>&& canonical_handles) {
191std::unique_ptr<CanonicalHandlesMap>
static constexpr BytecodeOffset None()
IdentityMapFindResult< V > FindOrInsert(DirectHandle< Object > key)
static V8_EXPORT_PRIVATE bool IsActive(Isolate *isolate)
void AttachCompilationInfo(CompilationInfoT *info)
void InitializeAndStartSerializing(DirectHandle< NativeContext > native_context)
compiler::JSHeapBroker * broker_
void ReopenAndCanonicalizeHandlesInNewScope(Isolate *isolate)
void set_graph_labeller(MaglevGraphLabeller *graph_labeller)
std::unique_ptr< MaglevGraphLabeller > graph_labeller_
void set_persistent_handles(std::unique_ptr< PersistentHandles > &&persistent_handles)
MaglevGraphLabeller * graph_labeller() const
void set_canonical_handles(std::unique_ptr< CanonicalHandlesMap > &&canonical_handles)
MaglevCompilationUnit * toplevel_compilation_unit_
std::unique_ptr< CanonicalHandlesMap > canonical_handles_
std::unique_ptr< PersistentHandles > DetachPersistentHandles()
CanonicalHandlesMap * canonical_handles()
std::unique_ptr< PersistentHandles > ph_
std::unique_ptr< CanonicalHandlesMap > DetachCanonicalHandles()
IndirectHandle< JSFunction > toplevel_function_
bool collect_source_positions_
MaglevCompilationInfo(Isolate *isolate, IndirectHandle< JSFunction > function, BytecodeOffset osr_offset, std::optional< compiler::JSHeapBroker * > broker=std::nullopt, std::optional< bool > specialize_to_function_context=std::nullopt, bool for_turboshaft_frontend=false)
compiler::JSHeapBroker * broker() const
static MaglevCompilationUnit * New(Zone *zone, MaglevCompilationInfo *info, Handle< JSFunction > function)
JSHeapBroker *const broker_
PersistentHandlesScope persistent_
#define MAGLEV_COMPILATION_FLAG_LIST(V)
V8_INLINE DirectHandle< T > direct_handle(Tagged< T > object, Isolate *isolate)
Handle< T > IndirectHandle
V8_EXPORT_PRIVATE FlagValues v8_flags
OptimizedCompilationInfo * info_
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)