summaryrefslogtreecommitdiff
path: root/deps/v8/src/builtins/setup-builtins-internal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/builtins/setup-builtins-internal.cc')
-rw-r--r--deps/v8/src/builtins/setup-builtins-internal.cc95
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);