77#include " src/builtins/builtins-inl.h"
88#include " src/builtins/profile-data-reader.h"
99#include " src/codegen/assembler-inl.h"
10+ #include " src/codegen/compiler.h"
1011#include " src/codegen/interface-descriptors.h"
1112#include " src/codegen/macro-assembler-inl.h"
1213#include " src/codegen/macro-assembler.h"
1314#include " src/codegen/reloc-info-inl.h"
1415#include " src/common/globals.h"
16+ #include " src/compiler-dispatcher/optimizing-compile-dispatcher.h"
1517#include " src/compiler/code-assembler.h"
1618#include " src/compiler/pipeline.h"
1719#include " src/compiler/turboshaft/phase.h"
@@ -92,10 +94,11 @@ AssemblerOptions BuiltinAssemblerOptions(Isolate* isolate, Builtin builtin) {
9294}
9395
9496using MacroAssemblerGenerator = void (*)(MacroAssembler*);
95- using CodeAssemblerGenerator = void (*)(compiler::CodeAssemblerState*);
9697using TurboshaftAssemblerGenerator =
9798 void (*)(compiler::turboshaft::PipelineData*, Isolate*,
9899 compiler::turboshaft::Graph&, Zone*);
100+ using CodeAssemblerGenerator = compiler::Pipeline::CodeAssemblerGenerator;
101+ using CodeAssemblerInstaller = compiler::Pipeline::CodeAssemblerInstaller;
99102
100103Handle<Code> BuildPlaceholder (Isolate* isolate, Builtin builtin) {
101104 HandleScope scope (isolate);
@@ -189,20 +192,16 @@ Tagged<Code> BuildAdaptor(Isolate* isolate, Builtin builtin,
189192 return *code;
190193}
191194
192- // Builder for builtins implemented in TurboFan with JS linkage.
193- V8_NOINLINE Tagged<Code> BuildWithCodeStubAssemblerJS (
194- Isolate* isolate, Builtin builtin, CodeAssemblerGenerator generator,
195- int argc, const char * name) {
196- HandleScope scope (isolate);
197-
198- Zone zone (isolate->allocator (), ZONE_NAME, kCompressGraphZone );
199- compiler::CodeAssemblerState state (isolate, &zone, argc, CodeKind::BUILTIN,
200- name, builtin);
201- generator (&state);
202- DirectHandle<Code> code = compiler::CodeAssembler::GenerateCode (
203- &state, BuiltinAssemblerOptions (isolate, builtin),
204- ProfileDataFromFile::TryRead (name));
205- return *code;
195+ void CompileJSLinkageCodeStubBuiltin (Isolate* isolate, Builtin builtin,
196+ CodeAssemblerGenerator generator,
197+ CodeAssemblerInstaller installer, int argc,
198+ const char * name) {
199+ std::unique_ptr<TurbofanCompilationJob> job (
200+ compiler::Pipeline::NewJSLinkageCodeStubBuiltinCompilationJob (
201+ isolate, builtin, generator, installer,
202+ BuiltinAssemblerOptions (isolate, builtin), argc, name,
203+ ProfileDataFromFile::TryRead (name)));
204+ compiler::CodeAssembler::CompileCode (isolate, std::move (job));
206205}
207206
208207inline constexpr char kTempZoneName [] = " temp-zone" ;
@@ -245,26 +244,38 @@ V8_NOINLINE Tagged<Code> BuildWithTurboshaftAssemblerCS(
245244}
246245
247246// Builder for builtins implemented in TurboFan with CallStub linkage.
248- V8_NOINLINE Tagged<Code> BuildWithCodeStubAssemblerCS (
249- Isolate* isolate, Builtin builtin, CodeAssemblerGenerator generator,
250- CallDescriptors::Key interface_descriptor, const char * name) {
247+ void CompileCSLinkageCodeStubBuiltin (Isolate* isolate, Builtin builtin,
248+ CodeAssemblerGenerator generator,
249+ CodeAssemblerInstaller installer,
250+ CallDescriptors::Key interface_descriptor,
251+ const char * name) {
251252 // TODO(nicohartmann): Remove this once `BuildWithTurboshaftAssemblerCS` has
252253 // an actual use.
253254 USE (&BuildWithTurboshaftAssemblerCS);
254- HandleScope scope (isolate);
255- Zone zone (isolate->allocator (), ZONE_NAME, kCompressGraphZone );
256- // The interface descriptor with given key must be initialized at this point
257- // and this construction just queries the details from the descriptors table.
258- CallInterfaceDescriptor descriptor (interface_descriptor);
259- // Ensure descriptor is already initialized.
260- DCHECK_LE (0 , descriptor.GetRegisterParameterCount ());
261- compiler::CodeAssemblerState state (isolate, &zone, descriptor,
262- CodeKind::BUILTIN, name, builtin);
263- generator (&state);
264- DirectHandle<Code> code = compiler::CodeAssembler::GenerateCode (
265- &state, BuiltinAssemblerOptions (isolate, builtin),
266- ProfileDataFromFile::TryRead (name));
267- return *code;
255+ std::unique_ptr<TurbofanCompilationJob> job (
256+ compiler::Pipeline::NewCSLinkageCodeStubBuiltinCompilationJob (
257+ isolate, builtin, generator, installer,
258+ BuiltinAssemblerOptions (isolate, builtin), interface_descriptor, name,
259+ ProfileDataFromFile::TryRead (name)));
260+ compiler::CodeAssembler::CompileCode (isolate, std::move (job));
261+ }
262+
263+ void CompileBytecodeHandler (
264+ Isolate* isolate, Builtin builtin, interpreter::OperandScale operand_scale,
265+ interpreter::Bytecode bytecode,
266+ compiler::Pipeline::CodeAssemblerInstaller installer) {
267+ DCHECK (interpreter::Bytecodes::BytecodeHasHandler (bytecode, operand_scale));
268+ const char * name = Builtins::name (builtin);
269+ auto generator = [bytecode,
270+ operand_scale](compiler::CodeAssemblerState* state) {
271+ interpreter::GenerateBytecodeHandler (state, bytecode, operand_scale);
272+ };
273+ std::unique_ptr<TurbofanCompilationJob> job (
274+ compiler::Pipeline::NewBytecodeHandlerCompilationJob (
275+ isolate, builtin, generator, installer,
276+ BuiltinAssemblerOptions (isolate, builtin), name,
277+ ProfileDataFromFile::TryRead (name)));
278+ compiler::CodeAssembler::CompileCode (isolate, std::move (job));
268279}
269280
270281} // anonymous namespace
@@ -342,20 +353,6 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) {
342353 }
343354}
344355
345- namespace {
346-
347- V8_NOINLINE Tagged<Code> GenerateBytecodeHandler (
348- Isolate* isolate, Builtin builtin, interpreter::OperandScale operand_scale,
349- interpreter::Bytecode bytecode) {
350- DCHECK (interpreter::Bytecodes::BytecodeHasHandler (bytecode, operand_scale));
351- DirectHandle<Code> code = interpreter::GenerateBytecodeHandler (
352- isolate, Builtins::name (builtin), bytecode, operand_scale, builtin,
353- BuiltinAssemblerOptions (isolate, builtin));
354- return *code;
355- }
356-
357- } // namespace
358-
359356// static
360357void SetupIsolateDelegate::SetupBuiltinsInternal (Isolate* isolate) {
361358 Builtins* builtins = isolate->builtins ();
@@ -379,11 +376,14 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) {
379376 AddBuiltin (builtins, Builtin::k##Name, code); \
380377 index++;
381378
382- #define BUILD_TFJ (Name, Argc, ...) \
383- code = BuildWithCodeStubAssemblerJS ( \
384- isolate, Builtin::k##Name, &Builtins::Generate_##Name, Argc, #Name); \
385- AddBuiltin (builtins, Builtin::k##Name, code); \
386- index++;
379+ #define BUILD_TFJ (Name, Argc, ...) \
380+ CompileJSLinkageCodeStubBuiltin ( \
381+ isolate, Builtin::k##Name, &Builtins::Generate_##Name, \
382+ [builtins, &index](Handle<Code> code) { \
383+ AddBuiltin (builtins, Builtin::k##Name, *code); \
384+ index++; \
385+ }, \
386+ Argc, #Name);
387387
388388#define BUILD_TSC (Name, InterfaceDescriptor ) \
389389 /* Return size is from the provided CallInterfaceDescriptor. */ \
@@ -395,33 +395,40 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) {
395395
396396#define BUILD_TFC (Name, InterfaceDescriptor ) \
397397 /* Return size is from the provided CallInterfaceDescriptor. */ \
398- code = BuildWithCodeStubAssemblerCS ( \
398+ CompileCSLinkageCodeStubBuiltin ( \
399399 isolate, Builtin::k##Name, &Builtins::Generate_##Name, \
400- CallDescriptors::InterfaceDescriptor, #Name); \
401- AddBuiltin (builtins, Builtin::k##Name, code); \
402- index++;
400+ [builtins, &index](Handle<Code> code) { \
401+ AddBuiltin (builtins, Builtin::k##Name, *code); \
402+ index++; \
403+ }, \
404+ CallDescriptors::InterfaceDescriptor, #Name);
403405
404406#define BUILD_TFS (Name, ...) \
405407 /* Return size for generic TF builtins (stub linkage) is always 1. */ \
406- code = BuildWithCodeStubAssemblerCS (isolate, Builtin::k##Name, \
407- &Builtins::Generate_##Name, \
408- CallDescriptors::Name, #Name); \
409- AddBuiltin (builtins, Builtin::k##Name, code); \
410- index++;
408+ CompileCSLinkageCodeStubBuiltin ( \
409+ isolate, Builtin::k##Name, &Builtins::Generate_##Name, \
410+ [builtins, &index](Handle<Code> code) { \
411+ AddBuiltin (builtins, Builtin::k##Name, *code); \
412+ index++; \
413+ }, \
414+ CallDescriptors::Name, #Name);
411415
412416#define BUILD_TFH (Name, InterfaceDescriptor ) \
413417 /* Return size for IC builtins/handlers is always 1. */ \
414- code = BuildWithCodeStubAssemblerCS ( \
418+ CompileCSLinkageCodeStubBuiltin ( \
415419 isolate, Builtin::k##Name, &Builtins::Generate_##Name, \
416- CallDescriptors::InterfaceDescriptor, #Name); \
417- AddBuiltin (builtins, Builtin::k##Name, code); \
418- index++;
419-
420- #define BUILD_BCH (Name, OperandScale, Bytecode ) \
421- code = GenerateBytecodeHandler (isolate, Builtin::k##Name, OperandScale, \
422- Bytecode); \
423- AddBuiltin (builtins, Builtin::k##Name, code); \
424- index++;
420+ [builtins, &index](Handle<Code> code) { \
421+ AddBuiltin (builtins, Builtin::k##Name, *code); \
422+ index++; \
423+ }, \
424+ CallDescriptors::InterfaceDescriptor, #Name);
425+
426+ #define BUILD_BCH (Name, OperandScale, Bytecode ) \
427+ CompileBytecodeHandler (isolate, Builtin::k##Name, OperandScale, Bytecode, \
428+ [builtins, &index](Handle<Code> code) { \
429+ AddBuiltin (builtins, Builtin::k##Name, *code); \
430+ index++; \
431+ });
425432
426433#define BUILD_ASM (Name, InterfaceDescriptor ) \
427434 code = BuildWithMacroAssembler (isolate, Builtin::k##Name, \
@@ -440,6 +447,11 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) {
440447#undef BUILD_TFH
441448#undef BUILD_BCH
442449#undef BUILD_ASM
450+
451+ if (v8_flags.concurrent_builtin_generation ) {
452+ isolate->optimizing_compile_dispatcher ()->AwaitCompileTasks ();
453+ isolate->optimizing_compile_dispatcher ()->InstallGeneratedBuiltins ();
454+ }
443455 CHECK_EQ (Builtins::kBuiltinCount , index);
444456
445457 ReplacePlaceholders (isolate);
0 commit comments