diff options
Diffstat (limited to 'deps/v8/src/builtins/setup-builtins-internal.cc')
-rw-r--r-- | deps/v8/src/builtins/setup-builtins-internal.cc | 87 |
1 files changed, 35 insertions, 52 deletions
diff --git a/deps/v8/src/builtins/setup-builtins-internal.cc b/deps/v8/src/builtins/setup-builtins-internal.cc index ab3a84fb01..b21e3f5b99 100644 --- a/deps/v8/src/builtins/setup-builtins-internal.cc +++ b/deps/v8/src/builtins/setup-builtins-internal.cc @@ -4,11 +4,15 @@ #include "src/setup-isolate.h" +#include "src/assembler-inl.h" #include "src/builtins/builtins.h" #include "src/code-events.h" #include "src/compiler/code-assembler.h" +#include "src/handles-inl.h" #include "src/interface-descriptors.h" #include "src/isolate.h" +#include "src/objects-inl.h" +#include "src/objects/shared-function-info.h" namespace v8 { namespace internal { @@ -17,6 +21,7 @@ namespace internal { #define FORWARD_DECLARE(Name) \ Object* Builtin_##Name(int argc, Object** args, Isolate* isolate); BUILTIN_LIST_C(FORWARD_DECLARE) +#undef FORWARD_DECLARE namespace { void PostBuildProfileAndTracing(Isolate* isolate, Code* code, @@ -37,8 +42,6 @@ void PostBuildProfileAndTracing(Isolate* isolate, Code* code, typedef void (*MacroAssemblerGenerator)(MacroAssembler*); typedef void (*CodeAssemblerGenerator)(compiler::CodeAssemblerState*); -static const ExtraICState kPlaceholderState = 1; - Handle<Code> BuildPlaceholder(Isolate* isolate) { HandleScope scope(isolate); const size_t buffer_size = 1 * KB; @@ -51,16 +54,14 @@ Handle<Code> BuildPlaceholder(Isolate* isolate) { } CodeDesc desc; masm.GetCode(isolate, &desc); - const Code::Flags kPlaceholderFlags = - Code::ComputeFlags(Code::BUILTIN, kPlaceholderState); Handle<Code> code = - isolate->factory()->NewCode(desc, kPlaceholderFlags, masm.CodeObject()); + isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); return scope.CloseAndEscape(code); } Code* BuildWithMacroAssembler(Isolate* isolate, MacroAssemblerGenerator generator, - Code::Flags flags, const char* s_name) { + const char* s_name) { HandleScope scope(isolate); // Canonicalize handles, so that we can share constant pool entries pointing // to code targets without dereferencing their handles. @@ -73,14 +74,13 @@ Code* BuildWithMacroAssembler(Isolate* isolate, CodeDesc desc; masm.GetCode(isolate, &desc); Handle<Code> code = - isolate->factory()->NewCode(desc, flags, masm.CodeObject()); + isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); PostBuildProfileAndTracing(isolate, *code, s_name); return *code; } Code* BuildAdaptor(Isolate* isolate, Address builtin_address, - Builtins::ExitFrameType exit_frame_type, Code::Flags flags, - const char* name) { + Builtins::ExitFrameType exit_frame_type, const char* name) { HandleScope scope(isolate); // Canonicalize handles, so that we can share constant pool entries pointing // to code targets without dereferencing their handles. @@ -93,7 +93,7 @@ Code* BuildAdaptor(Isolate* isolate, Address builtin_address, CodeDesc desc; masm.GetCode(isolate, &desc); Handle<Code> code = - isolate->factory()->NewCode(desc, flags, masm.CodeObject()); + isolate->factory()->NewCode(desc, Code::BUILTIN, masm.CodeObject()); PostBuildProfileAndTracing(isolate, *code, name); return *code; } @@ -101,7 +101,7 @@ Code* BuildAdaptor(Isolate* isolate, Address builtin_address, // Builder for builtins implemented in TurboFan with JS linkage. Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, CodeAssemblerGenerator generator, int argc, - Code::Flags flags, const char* name) { + const char* name) { HandleScope scope(isolate); // Canonicalize handles, so that we can share constant pool entries pointing // to code targets without dereferencing their handles. @@ -109,8 +109,8 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, Zone zone(isolate->allocator(), ZONE_NAME); const int argc_with_recv = (argc == SharedFunctionInfo::kDontAdaptArgumentsSentinel) ? 0 : argc + 1; - compiler::CodeAssemblerState state(isolate, &zone, argc_with_recv, flags, - name); + compiler::CodeAssemblerState state(isolate, &zone, argc_with_recv, + Code::BUILTIN, name); generator(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); PostBuildProfileAndTracing(isolate, *code, name); @@ -121,8 +121,7 @@ Code* BuildWithCodeStubAssemblerJS(Isolate* isolate, Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, CodeAssemblerGenerator generator, CallDescriptors::Key interface_descriptor, - Code::Flags flags, const char* name, - int result_size) { + const char* name, int result_size) { HandleScope scope(isolate); // Canonicalize handles, so that we can share constant pool entries pointing // to code targets without dereferencing their handles. @@ -133,8 +132,8 @@ Code* BuildWithCodeStubAssemblerCS(Isolate* isolate, CallInterfaceDescriptor descriptor(isolate, interface_descriptor); // Ensure descriptor is already initialized. DCHECK_LE(0, descriptor.GetRegisterParameterCount()); - compiler::CodeAssemblerState state(isolate, &zone, descriptor, flags, name, - result_size); + compiler::CodeAssemblerState state(isolate, &zone, descriptor, Code::BUILTIN, + name, result_size); generator(&state); Handle<Code> code = compiler::CodeAssembler::GenerateCode(&state); PostBuildProfileAndTracing(isolate, *code, name); @@ -167,8 +166,6 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) { DisallowHeapAllocation no_gc; static const int kRelocMask = RelocInfo::ModeMask(RelocInfo::CODE_TARGET) | RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT); - const Code::Flags kPlaceholderFlags = - Code::ComputeFlags(Code::BUILTIN, kPlaceholderState); HeapIterator iterator(isolate->heap()); while (HeapObject* obj = iterator.next()) { if (!obj->IsCode()) continue; @@ -178,7 +175,7 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) { RelocInfo* rinfo = it.rinfo(); if (RelocInfo::IsCodeTarget(rinfo->rmode())) { Code* target = Code::GetCodeFromTargetAddress(rinfo->target_address()); - if (target->flags() != kPlaceholderFlags) continue; + if (!target->is_builtin()) continue; Code* new_target = Code::cast(builtins->builtins_[target->builtin_index()]); rinfo->set_target_address(isolate, new_target->instruction_start(), @@ -188,7 +185,7 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) { Object* object = rinfo->target_object(); if (!object->IsCode()) continue; Code* target = Code::cast(object); - if (target->flags() != kPlaceholderFlags) continue; + if (!target->is_builtin()) continue; Code* new_target = Code::cast(builtins->builtins_[target->builtin_index()]); rinfo->set_target_object(new_target, UPDATE_WRITE_BARRIER, @@ -201,16 +198,6 @@ void SetupIsolateDelegate::ReplacePlaceholders(Isolate* isolate) { code->instruction_size()); } } -#ifdef DEBUG - // Verify that references to all placeholder builtins have been replaced. - // Skip this check for non-snapshot builds. - if (isolate->serializer_enabled()) { - HeapIterator iterator(isolate->heap(), HeapIterator::kFilterUnreachable); - while (HeapObject* obj = iterator.next()) { - if (obj->IsCode()) CHECK_NE(kPlaceholderFlags, Code::cast(obj)->flags()); - } - } -#endif } void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) { @@ -223,43 +210,39 @@ void SetupIsolateDelegate::SetupBuiltinsInternal(Isolate* isolate) { HandleScope scope(isolate); int index = 0; - const Code::Flags kBuiltinFlags = Code::ComputeFlags(Code::BUILTIN); Code* code; -#define BUILD_CPP(Name) \ - code = BuildAdaptor(isolate, FUNCTION_ADDR(Builtin_##Name), \ - Builtins::BUILTIN_EXIT, kBuiltinFlags, #Name); \ +#define BUILD_CPP(Name) \ + code = BuildAdaptor(isolate, 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, \ - kBuiltinFlags, #Name); \ + #Name); \ AddBuiltin(builtins, index++, code); #define BUILD_TFJ(Name, Argc, ...) \ code = BuildWithCodeStubAssemblerJS(isolate, &Builtins::Generate_##Name, \ - Argc, kBuiltinFlags, #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, \ - kBuiltinFlags, #Name, result_size); \ + #Name, result_size); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFS(Name, ...) \ - /* Return size for generic TF builtins (stub linkage) is always 1. */ \ +#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); \ + 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::Name, kBuiltinFlags, \ + CallDescriptors::InterfaceDescriptor, \ #Name, 1); \ AddBuiltin(builtins, index++, code); -#define BUILD_TFH(Name, Kind, Extra, InterfaceDescriptor) \ - { InterfaceDescriptor##Descriptor descriptor(isolate); } \ - /* Return size for IC builtins/handlers is always 1. */ \ - code = BuildWithCodeStubAssemblerCS(isolate, &Builtins::Generate_##Name, \ - CallDescriptors::InterfaceDescriptor, \ - Code::ComputeFlags(Code::Kind, Extra), \ - #Name, 1); \ - AddBuiltin(builtins, index++, code); -#define BUILD_ASM(Name) \ - code = BuildWithMacroAssembler(isolate, Builtins::Generate_##Name, \ - kBuiltinFlags, #Name); \ +#define BUILD_ASM(Name) \ + code = BuildWithMacroAssembler(isolate, Builtins::Generate_##Name, #Name); \ AddBuiltin(builtins, index++, code); BUILTIN_LIST(BUILD_CPP, BUILD_API, BUILD_TFJ, BUILD_TFC, BUILD_TFS, BUILD_TFH, |