diff options
Diffstat (limited to 'deps/v8/src/builtins/setup-builtins-internal.cc')
-rw-r--r-- | deps/v8/src/builtins/setup-builtins-internal.cc | 95 |
1 files changed, 51 insertions, 44 deletions
diff --git a/deps/v8/src/builtins/setup-builtins-internal.cc b/deps/v8/src/builtins/setup-builtins-internal.cc index b21e3f5b99..b9073e1f13 100644 --- a/deps/v8/src/builtins/setup-builtins-internal.cc +++ b/deps/v8/src/builtins/setup-builtins-internal.cc @@ -42,7 +42,7 @@ void PostBuildProfileAndTracing(Isolate* isolate, Code* code, typedef void (*MacroAssemblerGenerator)(MacroAssembler*); typedef void (*CodeAssemblerGenerator)(compiler::CodeAssemblerState*); -Handle<Code> BuildPlaceholder(Isolate* isolate) { +Handle<Code> BuildPlaceholder(Isolate* isolate, int32_t builtin_index) { HandleScope scope(isolate); const size_t buffer_size = 1 * KB; byte buffer[buffer_size]; // NOLINT(runtime/arrays) @@ -54,12 +54,12 @@ Handle<Code> BuildPlaceholder(Isolate* isolate) { } CodeDesc desc; masm.GetCode(isolate, &desc); - Handle<Code> code = - isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); + Handle<Code> code = isolate->factory()->NewCode( + desc, Code::BUILTIN, masm.CodeObject(), builtin_index); return scope.CloseAndEscape(code); } -Code* BuildWithMacroAssembler(Isolate* isolate, +Code* BuildWithMacroAssembler(Isolate* isolate, int32_t builtin_index, MacroAssemblerGenerator generator, const char* s_name) { HandleScope scope(isolate); @@ -73,13 +73,14 @@ Code* BuildWithMacroAssembler(Isolate* isolate, generator(&masm); CodeDesc desc; masm.GetCode(isolate, &desc); - Handle<Code> code = - isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); + Handle<Code> code = isolate->factory()->NewCode( + desc, Code::BUILTIN, masm.CodeObject(), builtin_index); PostBuildProfileAndTracing(isolate, *code, s_name); return *code; } -Code* BuildAdaptor(Isolate* isolate, Address builtin_address, +Code* BuildAdaptor(Isolate* isolate, int32_t builtin_index, + Address builtin_address, Builtins::ExitFrameType exit_frame_type, const char* name) { HandleScope scope(isolate); // Canonicalize handles, so that we can share constant pool entries pointing @@ -92,14 +93,14 @@ Code* BuildAdaptor(Isolate* isolate, Address builtin_address, Builtins::Generate_Adaptor(&masm, builtin_address, exit_frame_type); CodeDesc desc; masm.GetCode(isolate, &desc); - Handle<Code> code = - isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); + Handle<Code> code = isolate->factory()->NewCode( + desc, Code::BUILTIN, masm.CodeObject(), builtin_index); PostBuildProfileAndTracing(isolate, *code, name); return *code; } // Builder for builtins implemented in TurboFan with JS linkage. -Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, +Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, int32_t builtin_index, CodeAssemblerGenerator generator, int argc, const char* name) { HandleScope scope(isolate); @@ -110,7 +111,7 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, const int argc_with_recv = (argc == SharedFunctionInfo::kDontAdaptArgumentsSentinel) ? 0 : argc + 1; compiler::CodeAssemblerState state(isolate, &zone, argc_with_recv, - Code::BUILTIN, name); + Code::BUILTIN, name, builtin_index); generator(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); PostBuildProfileAndTracing(isolate, *code, name); @@ -118,7 +119,7 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, } // Builder for builtins implemented in TurboFan with CallStub linkage. -Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, +Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, int32_t builtin_index, CodeAssemblerGenerator generator, CallDescriptors::Key interface_descriptor, const char* name, int result_size) { @@ -133,7 +134,7 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, // Ensure descriptor is already initialized. DCHECK_LE(0, descriptor.GetRegisterParameterCount()); compiler::CodeAssemblerState state(isolate, &zone, descriptor, Code::BUILTIN, - name, result_size); + name, result_size, 0, builtin_index); generator(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); PostBuildProfileAndTracing(isolate, *code, name); @@ -143,8 +144,8 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, void SetupIsolateDelegate::AddBuiltin(Builtins* builtins, int index, Code* code) { + DCHECK_EQ(index, code->builtin_index()); builtins->builtins_[index] = code; - code->set_builtin_index(index); } void SetupIsolateDelegate::PopulateWithPlaceholders(Isolate* isolate) { @@ -153,10 +154,9 @@ void SetupIsolateDelegate::PopulateWithPlaceholders(Isolate* isolate) { // support circular references between builtins. Builtins* builtins = isolate->builtins(); HandleScope scope(isolate); - Handle<Code> placeholder = BuildPlaceholder(isolate); - AddBuiltin(builtins, 0, *placeholder); - for (int i = 1; i < Builtins::builtin_count; i++) { - AddBuiltin(builtins, i, *isolate->factory()->CopyCode(placeholder)); + for (int i = 0; i < Builtins::builtin_count; i++) { + Handle<Code> placeholder = BuildPlaceholder(isolate, i); + AddBuiltin(builtins, i, *placeholder); } } @@ -164,6 +164,7 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) { // Replace references from all code objects to placeholders. Builtins* builtins = isolate->builtins(); DisallowHeapAllocation no_gc; + CodeSpaceMemoryModificationScope modification_scope(isolate->heap()); static const int kRelocMask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); HeapIterator iterator(isolate->heap()); @@ -211,38 +212,40 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) { int index = 0; Code* code; -#define BUILD_CPP(Name) \ - code = BuildAdaptor(isolate, FUNCTION_ADDR(Builtin_##Name), \ - Builtins::BUILTIN_EXIT, #Name); \ +#define BUILD_CPP(Name) \ + code = BuildAdaptor(isolate, index, FUNCTION_ADDR(Builtin_##Name), \ + Builtins::BUILTIN_EXIT, #Name); \ AddBuiltin(builtins, index++, code); -#define BUILD_API(Name) \ - code = BuildAdaptor(isolate, FUNCTION_ADDR(Builtin_##Name), Builtins::EXIT, \ - #Name); \ +#define BUILD_API(Name) \ + code = BuildAdaptor(isolate, index, FUNCTION_ADDR(Builtin_##Name), \ + Builtins::EXIT, #Name); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFJ(Name, Argc, ...) \ - code = BuildWithCodeStubAssemblerJS(isolate, &Builtins::Generate_##Name, \ - Argc, #Name); \ +#define BUILD_TFJ(Name, Argc, ...) \ + code = BuildWithCodeStubAssemblerJS( \ + isolate, index, &Builtins::Generate_##Name, Argc, #Name); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFC(Name, InterfaceDescriptor, result_size) \ - { InterfaceDescriptor##Descriptor descriptor(isolate); } \ - code = BuildWithCodeStubAssemblerCS(isolate, &Builtins::Generate_##Name, \ - CallDescriptors::InterfaceDescriptor, \ - #Name, result_size); \ +#define BUILD_TFC(Name, InterfaceDescriptor, result_size) \ + { InterfaceDescriptor##Descriptor descriptor(isolate); } \ + code = BuildWithCodeStubAssemblerCS( \ + isolate, index, &Builtins::Generate_##Name, \ + CallDescriptors::InterfaceDescriptor, #Name, result_size); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFS(Name, ...) \ - /* Return size for generic TF builtins (stub linkage) is always 1. */ \ - code = BuildWithCodeStubAssemblerCS(isolate, &Builtins::Generate_##Name, \ - CallDescriptors::Name, #Name, 1); \ +#define BUILD_TFS(Name, ...) \ + /* Return size for generic TF builtins (stub linkage) is always 1. */ \ + code = \ + BuildWithCodeStubAssemblerCS(isolate, index, &Builtins::Generate_##Name, \ + CallDescriptors::Name, #Name, 1); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFH(Name, InterfaceDescriptor) \ - { InterfaceDescriptor##Descriptor descriptor(isolate); } \ - /* Return size for IC builtins/handlers is always 1. */ \ - code = BuildWithCodeStubAssemblerCS(isolate, &Builtins::Generate_##Name, \ - CallDescriptors::InterfaceDescriptor, \ - #Name, 1); \ +#define BUILD_TFH(Name, InterfaceDescriptor) \ + { InterfaceDescriptor##Descriptor descriptor(isolate); } \ + /* Return size for IC builtins/handlers is always 1. */ \ + code = BuildWithCodeStubAssemblerCS( \ + isolate, index, &Builtins::Generate_##Name, \ + CallDescriptors::InterfaceDescriptor, #Name, 1); \ AddBuiltin(builtins, index++, code); -#define BUILD_ASM(Name) \ - code = BuildWithMacroAssembler(isolate, Builtins::Generate_##Name, #Name); \ +#define BUILD_ASM(Name) \ + code = BuildWithMacroAssembler(isolate, index, Builtins::Generate_##Name, \ + #Name); \ AddBuiltin(builtins, index++, code); BUILTIN_LIST(BUILD_CPP, BUILD_API, BUILD_TFJ, BUILD_TFC, BUILD_TFS, BUILD_TFH, @@ -273,6 +276,10 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) { BUILTIN_EXCEPTION_CAUGHT_PREDICTION_LIST(SET_EXCEPTION_CAUGHT_PREDICTION) #undef SET_EXCEPTION_CAUGHT_PREDICTION + // TODO(mstarzinger,6792): This code-space modification section should be + // moved into {Heap} eventually and a safe wrapper be provided. + CodeSpaceMemoryModificationScope modification_scope(isolate->heap()); + #define SET_CODE_NON_TAGGED_PARAMS(Name) \ Code::cast(builtins->builtins_[Builtins::k##Name]) \ ->set_has_tagged_params(false); |