5#ifndef V8_CODEGEN_OPTIMIZED_COMPILATION_INFO_H_
6#define V8_CODEGEN_OPTIMIZED_COMPILATION_INFO_H_
24#if V8_ENABLE_WEBASSEMBLY
48struct WasmCompilationResult;
60 V(FunctionContextSpecializing, function_context_specializing, 0) \
61 V(Inlining, inlining, 1) \
62 V(DisableFutureOptimization, disable_future_optimization, 2) \
63 V(Splitting, splitting, 3) \
64 V(SourcePositions, source_positions, 4) \
65 V(BailoutOnUninitialized, bailout_on_uninitialized, 5) \
66 V(LoopPeeling, loop_peeling, 6) \
67 V(SwitchJumpTable, switch_jump_table, 7) \
68 V(CalledWithCodeStartRegister, called_with_code_start_register, 8) \
69 V(AllocationFolding, allocation_folding, 9) \
70 V(AnalyzeEnvironmentLiveness, analyze_environment_liveness, 10) \
71 V(TraceTurboJson, trace_turbo_json, 11) \
72 V(TraceTurboGraph, trace_turbo_graph, 12) \
73 V(TraceTurboScheduled, trace_turbo_scheduled, 13) \
74 V(TraceTurboAllocation, trace_turbo_allocation, 14) \
75 V(TraceHeapBroker, trace_heap_broker, 15) \
76 V(DiscardResultForTesting, discard_result_for_testing, 16) \
77 V(InlineJSWasmCalls, inline_js_wasm_calls, 17) \
78 V(TurboshaftTraceReduction, turboshaft_trace_reduction, 18) \
79 V(CouldNotInlineAllCandidates, could_not_inline_all_candidates, 19) \
80 V(ShadowStackCompliantLazyDeopt, shadow_stack_compliant_lazy_deopt, 20)
83#define DEF_ENUM(Camel, Lower, Bit) k##Camel = 1 << Bit,
88#define DEF_GETTER(Camel, Lower, Bit) \
89 bool Lower() const { \
90 return GetFlag(k##Camel); \
95#define DEF_SETTER(Camel, Lower, Bit) \
96 void set_##Lower() { \
103 OptimizedCompilationInfo(
Zone* zone, Isolate* isolate,
104 IndirectHandle<SharedFunctionInfo> shared,
105 IndirectHandle<JSFunction> closure,
106 CodeKind code_kind, BytecodeOffset osr_offset);
117 Builtin builtin = Builtin::kNoBuiltinId);
125 bool is_osr()
const {
return !osr_offset_.IsNone(); }
131 return bytecode_array_;
142 node_observer_ = observer;
150 bool has_context()
const;
153 bool has_native_context()
const;
156 bool has_global_object()
const;
163#if V8_ENABLE_WEBASSEMBLY
164 bool IsWasm()
const {
return code_kind() == CodeKind::WASM_FUNCTION; }
165 bool IsWasmBuiltin()
const {
166 return code_kind() == CodeKind::WASM_TO_JS_FUNCTION ||
167 code_kind() == CodeKind::WASM_TO_CAPI_FUNCTION ||
168 code_kind() == CodeKind::JS_TO_WASM_FUNCTION ||
169 (code_kind() == CodeKind::BUILTIN &&
170 (
builtin() == Builtin::kJSToWasmWrapper ||
171 builtin() == Builtin::kJSToWasmHandleReturns ||
172 builtin() == Builtin::kWasmToJsWrapperCSA ||
173 wasm::BuiltinLookup::IsWasmBuiltinId(
builtin())));
178 std::unique_ptr<PersistentHandles> persistent_handles) {
180 ph_ = std::move(persistent_handles);
185 std::unique_ptr<CanonicalHandlesMap> canonical_handles) {
187 canonical_handles_ = std::move(canonical_handles);
191 template <
typename T>
194 DCHECK(PersistentHandlesScope::IsActive(isolate));
195 auto find_result = canonical_handles_->FindOrInsert(
object);
196 if (!find_result.already_exists) {
202 void ReopenAndCanonicalizeHandlesInNewScope(
Isolate* isolate);
212 return optimization_id_;
218 inlined_bytecode_size_ =
size;
232 position.inlined_function_id =
static_cast<int>(inlined_function_id);
244 std::unique_ptr<char[]> GetDebugName()
const;
249 return trace_turbo_filename_.get();
253 trace_turbo_filename_ = std::move(
filename);
259 return was_cancelled_.load(std::memory_order_relaxed);
262 void mark_cancelled();
266 profiler_data_ = profiler_data;
271 return std::move(ph_);
276 return std::move(canonical_handles_);
280 void ConfigureFlags();
285 void SetTracingFlags(
bool passes_filter);
329 static constexpr int kNoOptimizationId = -1;
331 unsigned inlined_bytecode_size_ = 0;
338 std::atomic<bool> was_cancelled_ =
false;
350 std::unique_ptr<PersistentHandles>
ph_;
#define DEF_ENUM(Name,...)
V8_INLINE Address * location() const
bool has_bytecode_array() const
BasicBlockProfilerData * profiler_data() const
void set_trace_turbo_filename(std::unique_ptr< char[]> filename)
bool IsOptimizing() const
BytecodeOffset osr_offset() const
int optimization_id() const
std::unique_ptr< PersistentHandles > ph_
IndirectHandle< Code > code() const
void set_canonical_handles(std::unique_ptr< CanonicalHandlesMap > canonical_handles)
bool GetFlag(Flag flag) const
void set_profiler_data(BasicBlockProfilerData *profiler_data)
IndirectHandle< SharedFunctionInfo > shared_info_
Isolate *const isolate_unsafe_
TickCounter tick_counter_
const char * trace_turbo_filename() const
OptimizedCompilationInfo(Zone *zone, Isolate *isolate, IndirectHandle< SharedFunctionInfo > shared, IndirectHandle< JSFunction > closure, CodeKind code_kind)
IndirectHandle< SharedFunctionInfo > shared_info() const
CodeKind code_kind() const
std::vector< InlinedFunctionHolder > InlinedFunctionList
void set_persistent_handles(std::unique_ptr< PersistentHandles > persistent_handles)
IndirectHandle< BytecodeArray > bytecode_array_
std::unique_ptr< CanonicalHandlesMap > canonical_handles_
IndirectHandle< Code > code_
OptimizedCompilationInfo & operator=(const OptimizedCompilationInfo &)=delete
void set_builtin(Builtin builtin)
IndirectHandle< JSFunction > closure() const
std::unique_ptr< PersistentHandles > DetachPersistentHandles()
void SetNodeObserver(compiler::NodeObserver *observer)
bool has_shared_info() const
base::Vector< const char > debug_name_
unsigned inlined_bytecode_size() const
bool was_cancelled() const
InlinedFunctionList inlined_functions_
std::unique_ptr< char[]> trace_turbo_filename_
OptimizedCompilationInfo(const OptimizedCompilationInfo &)=delete
CanonicalHandlesMap * canonical_handles()
void set_inlined_bytecode_size(unsigned size)
const CodeKind code_kind_
IndirectHandle< BytecodeArray > bytecode_array() const
IndirectHandle< T > CanonicalHandle(Tagged< T > object, Isolate *isolate)
const int optimization_id_
IndirectHandle< JSFunction > closure_
std::unique_ptr< CanonicalHandlesMap > DetachCanonicalHandles()
InlinedFunctionList & inlined_functions()
TickCounter & tick_counter()
BailoutReason bailout_reason() const
compiler::NodeObserver * node_observer() const
ZoneList< RegExpInstruction > code_
LiftoffBailoutReason bailout_reason_
constexpr bool CodeKindIsOptimizedJSFunction(CodeKind kind)
!IsContextMap !IsContextMap native_context
#define DEF_GETTER(Camel, Lower, Bit)
#define DEF_SETTER(Camel, Lower, Bit)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define V8_EXPORT_PRIVATE
IndirectHandle< BytecodeArray > bytecode_array
void RegisterInlinedFunctionId(size_t inlined_function_id)
InliningPosition position
IndirectHandle< SharedFunctionInfo > shared_info