diff options
author | Michaël Zasso <targos@protonmail.com> | 2020-10-15 20:17:08 +0200 |
---|---|---|
committer | Michaël Zasso <targos@protonmail.com> | 2020-10-18 20:16:47 +0200 |
commit | a1d639ba5de4ff34e34fb575fbb6cc1d41ec3cce (patch) | |
tree | abc7d41c12f1495b1208fa4449cb2508c92c5e85 /deps/v8/src/codegen/compiler.h | |
parent | 089d654dd85f8e548597329f60a41d6029260caa (diff) | |
download | node-new-a1d639ba5de4ff34e34fb575fbb6cc1d41ec3cce.tar.gz |
deps: update V8 to 8.6.395
PR-URL: https://github.com/nodejs/node/pull/35415
Reviewed-By: Rich Trott <rtrott@gmail.com>
Reviewed-By: Jiawen Geng <technicalcute@gmail.com>
Reviewed-By: Daniel Bevenius <daniel.bevenius@gmail.com>
Reviewed-By: Matteo Collina <matteo.collina@gmail.com>
Reviewed-By: Myles Borins <myles.borins@gmail.com>
Diffstat (limited to 'deps/v8/src/codegen/compiler.h')
-rw-r--r-- | deps/v8/src/codegen/compiler.h | 160 |
1 files changed, 98 insertions, 62 deletions
diff --git a/deps/v8/src/codegen/compiler.h b/deps/v8/src/codegen/compiler.h index b851d6abd6..2af1baa277 100644 --- a/deps/v8/src/codegen/compiler.h +++ b/deps/v8/src/codegen/compiler.h @@ -12,7 +12,8 @@ #include "src/codegen/bailout-reason.h" #include "src/common/globals.h" #include "src/execution/isolate.h" -#include "src/execution/off-thread-isolate.h" +#include "src/execution/local-isolate.h" +#include "src/handles/persistent-handles.h" #include "src/logging/code-events.h" #include "src/objects/contexts.h" #include "src/parsing/parse-info.h" @@ -43,6 +44,10 @@ class WorkerThreadRuntimeCallStats; using UnoptimizedCompilationJobList = std::forward_list<std::unique_ptr<UnoptimizedCompilationJob>>; +inline bool ShouldSpawnExtraNativeContextIndependentCompilationJob() { + return FLAG_turbo_nci && !FLAG_turbo_nci_as_highest_tier; +} + // The V8 compiler API. // // This is the central hub for dispatching to the various compilers within V8. @@ -68,7 +73,8 @@ class V8_EXPORT_PRIVATE Compiler : public AllStatic { IsCompiledScope* is_compiled_scope); static bool Compile(Handle<JSFunction> function, ClearExceptionFlag flag, IsCompiledScope* is_compiled_scope); - static bool CompileOptimized(Handle<JSFunction> function, ConcurrencyMode); + static bool CompileOptimized(Handle<JSFunction> function, + ConcurrencyMode mode, CodeKind code_kind); // Collect source positions for a function that has already been compiled to // bytecode, but for which source positions were not collected (e.g. because @@ -196,7 +202,7 @@ class V8_EXPORT_PRIVATE Compiler : public AllStatic { // thread. The current state of the job can be checked using {state()}. class V8_EXPORT_PRIVATE CompilationJob { public: - enum Status { SUCCEEDED, FAILED }; + enum Status { SUCCEEDED, FAILED, RETRY_ON_MAIN_THREAD }; enum class State { kReadyToPrepare, kReadyToExecute, @@ -218,10 +224,16 @@ class V8_EXPORT_PRIVATE CompilationJob { } V8_WARN_UNUSED_RESULT Status UpdateState(Status status, State next_state) { - if (status == SUCCEEDED) { - state_ = next_state; - } else { - state_ = State::kFailed; + switch (status) { + case SUCCEEDED: + state_ = next_state; + break; + case FAILED: + state_ = State::kFailed; + break; + case RETRY_ON_MAIN_THREAD: + // Don't change the state, we'll re-try on the main thread. + break; } return status; } @@ -241,17 +253,12 @@ class V8_EXPORT_PRIVATE CompilationJob { // Either of phases can either fail or succeed. class UnoptimizedCompilationJob : public CompilationJob { public: - enum class CanOffThreadFinalize : bool { kYes = true, kNo = false }; - UnoptimizedCompilationJob(uintptr_t stack_limit, ParseInfo* parse_info, - UnoptimizedCompilationInfo* compilation_info, - CanOffThreadFinalize can_off_thread_finalize) + UnoptimizedCompilationInfo* compilation_info) : CompilationJob(State::kReadyToExecute), stack_limit_(stack_limit), parse_info_(parse_info), - compilation_info_(compilation_info), - can_off_thread_finalize_(can_off_thread_finalize == - CanOffThreadFinalize::kYes) {} + compilation_info_(compilation_info) {} // Executes the compile job. Can be called on a background thread. V8_WARN_UNUSED_RESULT Status ExecuteJob(); @@ -260,16 +267,21 @@ class UnoptimizedCompilationJob : public CompilationJob { V8_WARN_UNUSED_RESULT Status FinalizeJob(Handle<SharedFunctionInfo> shared_info, Isolate* isolate); - // Finalizes the compile job. Can be called on a background thread. - V8_WARN_UNUSED_RESULT Status FinalizeJob( - Handle<SharedFunctionInfo> shared_info, OffThreadIsolate* isolate); + // Finalizes the compile job. Can be called on a background thread, and might + // return RETRY_ON_MAIN_THREAD if the finalization can't be run on the + // background thread, and should instead be retried on the foreground thread. + V8_WARN_UNUSED_RESULT Status + FinalizeJob(Handle<SharedFunctionInfo> shared_info, LocalIsolate* isolate); void RecordCompilationStats(Isolate* isolate) const; void RecordFunctionCompilation(CodeEventListener::LogEventsAndTags tag, Handle<SharedFunctionInfo> shared, Isolate* isolate) const; - ParseInfo* parse_info() const { return parse_info_; } + ParseInfo* parse_info() const { + DCHECK_NOT_NULL(parse_info_); + return parse_info_; + } UnoptimizedCompilationInfo* compilation_info() const { return compilation_info_; } @@ -283,7 +295,7 @@ class UnoptimizedCompilationJob : public CompilationJob { return time_taken_to_finalize_; } - bool can_off_thread_finalize() const { return can_off_thread_finalize_; } + void ClearParseInfo() { parse_info_ = nullptr; } protected: // Overridden by the actual implementation. @@ -291,7 +303,7 @@ class UnoptimizedCompilationJob : public CompilationJob { virtual Status FinalizeJobImpl(Handle<SharedFunctionInfo> shared_info, Isolate* isolate) = 0; virtual Status FinalizeJobImpl(Handle<SharedFunctionInfo> shared_info, - OffThreadIsolate* isolate) = 0; + LocalIsolate* isolate) = 0; private: uintptr_t stack_limit_; @@ -299,7 +311,6 @@ class UnoptimizedCompilationJob : public CompilationJob { UnoptimizedCompilationInfo* compilation_info_; base::TimeDelta time_taken_to_execute_; base::TimeDelta time_taken_to_finalize_; - bool can_off_thread_finalize_; }; // A base class for optimized compilation jobs. @@ -369,25 +380,15 @@ class FinalizeUnoptimizedCompilationData { base::TimeDelta time_taken_to_finalize) : time_taken_to_execute_(time_taken_to_execute), time_taken_to_finalize_(time_taken_to_finalize), - function_handle_(function_handle), - handle_state_(kHandle) {} + function_handle_(function_handle) {} - FinalizeUnoptimizedCompilationData(OffThreadIsolate* isolate, + FinalizeUnoptimizedCompilationData(LocalIsolate* isolate, Handle<SharedFunctionInfo> function_handle, base::TimeDelta time_taken_to_execute, - base::TimeDelta time_taken_to_finalize) - : time_taken_to_execute_(time_taken_to_execute), - time_taken_to_finalize_(time_taken_to_finalize), - function_transfer_handle_(isolate->TransferHandle(function_handle)), - handle_state_(kTransferHandle) {} + base::TimeDelta time_taken_to_finalize); Handle<SharedFunctionInfo> function_handle() const { - switch (handle_state_) { - case kHandle: - return function_handle_; - case kTransferHandle: - return function_transfer_handle_.ToHandle(); - } + return function_handle_; } base::TimeDelta time_taken_to_execute() const { @@ -400,16 +401,52 @@ class FinalizeUnoptimizedCompilationData { private: base::TimeDelta time_taken_to_execute_; base::TimeDelta time_taken_to_finalize_; - union { - Handle<SharedFunctionInfo> function_handle_; - OffThreadTransferHandle<SharedFunctionInfo> function_transfer_handle_; - }; - enum { kHandle, kTransferHandle } handle_state_; + Handle<SharedFunctionInfo> function_handle_; }; using FinalizeUnoptimizedCompilationDataList = std::vector<FinalizeUnoptimizedCompilationData>; +class DeferredFinalizationJobData { + public: + DeferredFinalizationJobData(Isolate* isolate, + Handle<SharedFunctionInfo> function_handle, + std::unique_ptr<UnoptimizedCompilationJob> job) { + UNREACHABLE(); + } + DeferredFinalizationJobData(LocalIsolate* isolate, + Handle<SharedFunctionInfo> function_handle, + std::unique_ptr<UnoptimizedCompilationJob> job); + + Handle<SharedFunctionInfo> function_handle() const { + return function_handle_; + } + + UnoptimizedCompilationJob* job() const { return job_.get(); } + + private: + Handle<SharedFunctionInfo> function_handle_; + std::unique_ptr<UnoptimizedCompilationJob> job_; +}; + +// A wrapper around a OptimizedCompilationInfo that detaches the Handles from +// the underlying PersistentHandlesScope and stores them in info_ on +// destruction. +class CompilationHandleScope final { + public: + explicit CompilationHandleScope(Isolate* isolate, + OptimizedCompilationInfo* info) + : persistent_(isolate), info_(info) {} + ~CompilationHandleScope(); + + private: + PersistentHandlesScope persistent_; + OptimizedCompilationInfo* info_; +}; + +using DeferredFinalizationJobDataList = + std::vector<DeferredFinalizationJobData>; + class V8_EXPORT_PRIVATE BackgroundCompileTask { public: // Creates a new task that when run will parse and compile the streamed @@ -435,34 +472,31 @@ class V8_EXPORT_PRIVATE BackgroundCompileTask { return info_.get(); } Parser* parser() { return parser_.get(); } - UnoptimizedCompilationJob* outer_function_job() { - return outer_function_job_.get(); - } - UnoptimizedCompilationJobList* inner_function_jobs() { - return &inner_function_jobs_; + UnoptimizedCompilationJobList* compilation_jobs() { + return &compilation_jobs_; } UnoptimizedCompileFlags flags() const { return flags_; } - const UnoptimizedCompileState* compile_state() const { - return &compile_state_; - } + UnoptimizedCompileState* compile_state() { return &compile_state_; } LanguageMode language_mode() { return language_mode_; } bool finalize_on_background_thread() { return finalize_on_background_thread_; } - OffThreadIsolate* off_thread_isolate() { return off_thread_isolate_.get(); } - MaybeHandle<SharedFunctionInfo> outer_function_sfi() { - DCHECK_NOT_NULL(off_thread_isolate_); - return outer_function_sfi_.ToHandle(); - } - Handle<Script> script() { - DCHECK_NOT_NULL(off_thread_isolate_); - return script_.ToHandle(); - } FinalizeUnoptimizedCompilationDataList* finalize_unoptimized_compilation_data() { return &finalize_unoptimized_compilation_data_; } + // Jobs which could not be finalized in the background task, and need to be + // finalized on the main thread. + DeferredFinalizationJobDataList* jobs_to_retry_finalization_on_main_thread() { + return &jobs_to_retry_finalization_on_main_thread_; + } + + // Getters for the off-thread finalization results, that create main-thread + // handles to the objects. + MaybeHandle<SharedFunctionInfo> GetOuterFunctionSfi(Isolate* isolate); + Handle<Script> GetScript(Isolate* isolate); + private: // Data needed for parsing, and data needed to to be passed between thread // between parsing and compilation. These need to be initialized before the @@ -473,17 +507,19 @@ class V8_EXPORT_PRIVATE BackgroundCompileTask { std::unique_ptr<Parser> parser_; // Data needed for finalizing compilation after background compilation. - std::unique_ptr<UnoptimizedCompilationJob> outer_function_job_; - UnoptimizedCompilationJobList inner_function_jobs_; + UnoptimizedCompilationJobList compilation_jobs_; // Data needed for merging onto the main thread after background finalization. // TODO(leszeks): When these are available, the above fields are not. We // should add some stricter type-safety or DCHECKs to ensure that the user of // the task knows this. - std::unique_ptr<OffThreadIsolate> off_thread_isolate_; - OffThreadTransferMaybeHandle<SharedFunctionInfo> outer_function_sfi_; - OffThreadTransferHandle<Script> script_; + Isolate* isolate_for_local_isolate_; + std::unique_ptr<PersistentHandles> persistent_handles_; + MaybeHandle<SharedFunctionInfo> outer_function_sfi_; + Handle<Script> script_; + IsCompiledScope is_compiled_scope_; FinalizeUnoptimizedCompilationDataList finalize_unoptimized_compilation_data_; + DeferredFinalizationJobDataList jobs_to_retry_finalization_on_main_thread_; // Single function data for top-level function compilation. int start_position_; |