Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1946)

Side by Side Diff: src/builtins.cc

Issue 2090723005: [builtins] New frame type for exits to C++ builtins (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 6 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/builtins.h" 5 #include "src/builtins.h"
6 6
7 #include "src/api-arguments.h" 7 #include "src/api-arguments.h"
8 #include "src/api-natives.h" 8 #include "src/api-natives.h"
9 #include "src/api.h" 9 #include "src/api.h"
10 #include "src/base/ieee754.h" 10 #include "src/base/ieee754.h"
(...skipping 5578 matching lines...) Expand 10 before | Expand all | Expand 10 after
5589 5589
5590 Builtins::Builtins() : initialized_(false) { 5590 Builtins::Builtins() : initialized_(false) {
5591 memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count); 5591 memset(builtins_, 0, sizeof(builtins_[0]) * builtin_count);
5592 memset(names_, 0, sizeof(names_[0]) * builtin_count); 5592 memset(names_, 0, sizeof(names_[0]) * builtin_count);
5593 } 5593 }
5594 5594
5595 5595
5596 Builtins::~Builtins() { 5596 Builtins::~Builtins() {
5597 } 5597 }
5598 5598
5599 #define DEF_ENUM_C(name) FUNCTION_ADDR(Builtin_##name), 5599 #define DEF_ENUM_C(name, ignore) FUNCTION_ADDR(Builtin_##name),
5600 Address const Builtins::c_functions_[cfunction_count] = { 5600 Address const Builtins::c_functions_[cfunction_count] = {
5601 BUILTIN_LIST_C(DEF_ENUM_C) 5601 BUILTIN_LIST_C(DEF_ENUM_C)
5602 }; 5602 };
5603 #undef DEF_ENUM_C 5603 #undef DEF_ENUM_C
5604 5604
5605 5605
5606 struct BuiltinDesc { 5606 struct BuiltinDesc {
5607 Handle<Code> (*builder)(Isolate*, struct BuiltinDesc const*); 5607 Handle<Code> (*builder)(Isolate*, struct BuiltinDesc const*);
5608 byte* generator; 5608 byte* generator;
5609 byte* c_code; 5609 byte* c_code;
5610 const char* s_name; // name is only used for generating log information. 5610 const char* s_name; // name is only used for generating log information.
5611 int name; 5611 int name;
5612 Code::Flags flags; 5612 Code::Flags flags;
5613 bool builtin_exit_frame;
5613 int argc; 5614 int argc;
5614 }; 5615 };
5615 5616
5616 #define BUILTIN_FUNCTION_TABLE_INIT { V8_ONCE_INIT, {} } 5617 #define BUILTIN_FUNCTION_TABLE_INIT { V8_ONCE_INIT, {} }
5617 5618
5618 class BuiltinFunctionTable { 5619 class BuiltinFunctionTable {
5619 public: 5620 public:
5620 BuiltinDesc* functions() { 5621 BuiltinDesc* functions() {
5621 base::CallOnce(&once_, &Builtins::InitBuiltinFunctionTable); 5622 base::CallOnce(&once_, &Builtins::InitBuiltinFunctionTable);
5622 return functions_; 5623 return functions_;
(...skipping 24 matching lines...) Expand all
5647 const size_t buffer_size = 8 * KB; 5648 const size_t buffer_size = 8 * KB;
5648 #endif 5649 #endif
5649 union { 5650 union {
5650 int force_alignment; 5651 int force_alignment;
5651 byte buffer[buffer_size]; // NOLINT(runtime/arrays) 5652 byte buffer[buffer_size]; // NOLINT(runtime/arrays)
5652 } u; 5653 } u;
5653 5654
5654 MacroAssembler masm(isolate, u.buffer, sizeof(u.buffer), 5655 MacroAssembler masm(isolate, u.buffer, sizeof(u.buffer),
5655 CodeObjectRequired::kYes); 5656 CodeObjectRequired::kYes);
5656 // Generate the code/adaptor. 5657 // Generate the code/adaptor.
5657 typedef void (*Generator)(MacroAssembler*, int); 5658 typedef void (*Generator)(MacroAssembler*, int, bool);
5658 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator); 5659 Generator g = FUNCTION_CAST<Generator>(builtin_desc->generator);
5659 // We pass all arguments to the generator, but it may not use all of 5660 // We pass all arguments to the generator, but it may not use all of
5660 // them. This works because the first arguments are on top of the 5661 // them. This works because the first arguments are on top of the
5661 // stack. 5662 // stack.
5662 DCHECK(!masm.has_frame()); 5663 DCHECK(!masm.has_frame());
5663 g(&masm, builtin_desc->name); 5664 g(&masm, builtin_desc->name, builtin_desc->builtin_exit_frame);
5664 // Move the code into the object heap. 5665 // Move the code into the object heap.
5665 CodeDesc desc; 5666 CodeDesc desc;
5666 masm.GetCode(&desc); 5667 masm.GetCode(&desc);
5667 Code::Flags flags = builtin_desc->flags; 5668 Code::Flags flags = builtin_desc->flags;
5668 return isolate->factory()->NewCode(desc, flags, masm.CodeObject()); 5669 return isolate->factory()->NewCode(desc, flags, masm.CodeObject());
5669 } 5670 }
5670 5671
5671 // Builder for builtins implemented in TurboFan with JS linkage. 5672 // Builder for builtins implemented in TurboFan with JS linkage.
5672 Handle<Code> CodeStubAssemblerBuilderJS(Isolate* isolate, 5673 Handle<Code> CodeStubAssemblerBuilderJS(Isolate* isolate,
5673 BuiltinDesc const* builtin_desc) { 5674 BuiltinDesc const* builtin_desc) {
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after
5707 // within the lexical scope of Builtins:: and within a context where 5708 // within the lexical scope of Builtins:: and within a context where
5708 // Code::Flags names a non-abstract type. 5709 // Code::Flags names a non-abstract type.
5709 void Builtins::InitBuiltinFunctionTable() { 5710 void Builtins::InitBuiltinFunctionTable() {
5710 BuiltinDesc* functions = builtin_function_table.functions_; 5711 BuiltinDesc* functions = builtin_function_table.functions_;
5711 functions[builtin_count].builder = nullptr; 5712 functions[builtin_count].builder = nullptr;
5712 functions[builtin_count].generator = nullptr; 5713 functions[builtin_count].generator = nullptr;
5713 functions[builtin_count].c_code = nullptr; 5714 functions[builtin_count].c_code = nullptr;
5714 functions[builtin_count].s_name = nullptr; 5715 functions[builtin_count].s_name = nullptr;
5715 functions[builtin_count].name = builtin_count; 5716 functions[builtin_count].name = builtin_count;
5716 functions[builtin_count].flags = static_cast<Code::Flags>(0); 5717 functions[builtin_count].flags = static_cast<Code::Flags>(0);
5718 functions[builtin_count].builtin_exit_frame = false;
5717 functions[builtin_count].argc = 0; 5719 functions[builtin_count].argc = 0;
5718 5720
5719 #define DEF_FUNCTION_PTR_C(aname) \ 5721 #define DEF_FUNCTION_PTR_C(aname, is_builtin_exit_frame) \
5720 functions->builder = &MacroAssemblerBuilder; \ 5722 functions->builder = &MacroAssemblerBuilder; \
5721 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \ 5723 functions->generator = FUNCTION_ADDR(Generate_Adaptor); \
5722 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \ 5724 functions->c_code = FUNCTION_ADDR(Builtin_##aname); \
5723 functions->s_name = #aname; \ 5725 functions->s_name = #aname; \
5724 functions->name = c_##aname; \ 5726 functions->name = c_##aname; \
5725 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ 5727 functions->flags = Code::ComputeFlags(Code::BUILTIN); \
5728 functions->builtin_exit_frame = is_builtin_exit_frame; \
5726 functions->argc = 0; \ 5729 functions->argc = 0; \
5727 ++functions; 5730 ++functions;
5728 5731
5729 #define DEF_FUNCTION_PTR_A(aname, kind, extra) \ 5732 #define DEF_FUNCTION_PTR_A(aname, kind, extra) \
5730 functions->builder = &MacroAssemblerBuilder; \ 5733 functions->builder = &MacroAssemblerBuilder; \
5731 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5734 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5732 functions->c_code = NULL; \ 5735 functions->c_code = NULL; \
5733 functions->s_name = #aname; \ 5736 functions->s_name = #aname; \
5734 functions->name = k##aname; \ 5737 functions->name = k##aname; \
5735 functions->flags = Code::ComputeFlags(Code::kind, extra); \ 5738 functions->flags = Code::ComputeFlags(Code::kind, extra); \
5739 functions->builtin_exit_frame = false; \
5736 functions->argc = 0; \ 5740 functions->argc = 0; \
5737 ++functions; 5741 ++functions;
5738 5742
5739 #define DEF_FUNCTION_PTR_T(aname, aargc) \ 5743 #define DEF_FUNCTION_PTR_T(aname, aargc) \
5740 functions->builder = &CodeStubAssemblerBuilderJS; \ 5744 functions->builder = &CodeStubAssemblerBuilderJS; \
5741 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5745 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5742 functions->c_code = NULL; \ 5746 functions->c_code = NULL; \
5743 functions->s_name = #aname; \ 5747 functions->s_name = #aname; \
5744 functions->name = k##aname; \ 5748 functions->name = k##aname; \
5745 functions->flags = Code::ComputeFlags(Code::BUILTIN); \ 5749 functions->flags = Code::ComputeFlags(Code::BUILTIN); \
5750 functions->builtin_exit_frame = false; \
5746 functions->argc = aargc; \ 5751 functions->argc = aargc; \
5747 ++functions; 5752 ++functions;
5748 5753
5749 #define DEF_FUNCTION_PTR_S(aname, kind, extra, interface_descriptor) \ 5754 #define DEF_FUNCTION_PTR_S(aname, kind, extra, interface_descriptor) \
5750 functions->builder = &CodeStubAssemblerBuilderCS; \ 5755 functions->builder = &CodeStubAssemblerBuilderCS; \
5751 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5756 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5752 functions->c_code = NULL; \ 5757 functions->c_code = NULL; \
5753 functions->s_name = #aname; \ 5758 functions->s_name = #aname; \
5754 functions->name = k##aname; \ 5759 functions->name = k##aname; \
5755 functions->flags = Code::ComputeFlags(Code::kind, extra); \ 5760 functions->flags = Code::ComputeFlags(Code::kind, extra); \
5761 functions->builtin_exit_frame = false; \
5756 functions->argc = CallDescriptors::interface_descriptor; \ 5762 functions->argc = CallDescriptors::interface_descriptor; \
5757 ++functions; 5763 ++functions;
5758 5764
5759 #define DEF_FUNCTION_PTR_H(aname, kind) \ 5765 #define DEF_FUNCTION_PTR_H(aname, kind) \
5760 functions->builder = &MacroAssemblerBuilder; \ 5766 functions->builder = &MacroAssemblerBuilder; \
5761 functions->generator = FUNCTION_ADDR(Generate_##aname); \ 5767 functions->generator = FUNCTION_ADDR(Generate_##aname); \
5762 functions->c_code = NULL; \ 5768 functions->c_code = NULL; \
5763 functions->s_name = #aname; \ 5769 functions->s_name = #aname; \
5764 functions->name = k##aname; \ 5770 functions->name = k##aname; \
5765 functions->flags = Code::ComputeHandlerFlags(Code::kind); \ 5771 functions->flags = Code::ComputeHandlerFlags(Code::kind); \
5772 functions->builtin_exit_frame = false; \
5766 functions->argc = 0; \ 5773 functions->argc = 0; \
5767 ++functions; 5774 ++functions;
5768 5775
5769 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C) 5776 BUILTIN_LIST_C(DEF_FUNCTION_PTR_C)
5770 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A) 5777 BUILTIN_LIST_A(DEF_FUNCTION_PTR_A)
5771 BUILTIN_LIST_T(DEF_FUNCTION_PTR_T) 5778 BUILTIN_LIST_T(DEF_FUNCTION_PTR_T)
5772 BUILTIN_LIST_S(DEF_FUNCTION_PTR_S) 5779 BUILTIN_LIST_S(DEF_FUNCTION_PTR_S)
5773 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H) 5780 BUILTIN_LIST_H(DEF_FUNCTION_PTR_H)
5774 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A) 5781 BUILTIN_LIST_DEBUG_A(DEF_FUNCTION_PTR_A)
5775 5782
(...skipping 313 matching lines...) Expand 10 before | Expand all | Expand 10 after
6089 a->Bind(&u32); 6096 a->Bind(&u32);
6090 a->AtomicStore(MachineRepresentation::kWord32, backing_store, 6097 a->AtomicStore(MachineRepresentation::kWord32, backing_store,
6091 a->WordShl(index_word, 2), value_word32); 6098 a->WordShl(index_word, 2), value_word32);
6092 a->Return(value_integer); 6099 a->Return(value_integer);
6093 6100
6094 // This shouldn't happen, we've already validated the type. 6101 // This shouldn't happen, we've already validated the type.
6095 a->Bind(&other); 6102 a->Bind(&other);
6096 a->Return(a->Int32Constant(0)); 6103 a->Return(a->Int32Constant(0));
6097 } 6104 }
6098 6105
6099 #define DEFINE_BUILTIN_ACCESSOR_C(name) \ 6106 #define DEFINE_BUILTIN_ACCESSOR_C(name, ignore) \
6100 Handle<Code> Builtins::name() { \ 6107 Handle<Code> Builtins::name() { \
6101 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ 6108 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \
6102 return Handle<Code>(code_address); \ 6109 return Handle<Code>(code_address); \
6103 } 6110 }
6104 #define DEFINE_BUILTIN_ACCESSOR_A(name, kind, extra) \ 6111 #define DEFINE_BUILTIN_ACCESSOR_A(name, kind, extra) \
6105 Handle<Code> Builtins::name() { \ 6112 Handle<Code> Builtins::name() { \
6106 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \ 6113 Code** code_address = reinterpret_cast<Code**>(builtin_address(k##name)); \
6107 return Handle<Code>(code_address); \ 6114 return Handle<Code>(code_address); \
6108 } 6115 }
6109 #define DEFINE_BUILTIN_ACCESSOR_T(name, argc) \ 6116 #define DEFINE_BUILTIN_ACCESSOR_T(name, argc) \
(...skipping 19 matching lines...) Expand all
6129 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H) 6136 BUILTIN_LIST_H(DEFINE_BUILTIN_ACCESSOR_H)
6130 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 6137 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
6131 #undef DEFINE_BUILTIN_ACCESSOR_C 6138 #undef DEFINE_BUILTIN_ACCESSOR_C
6132 #undef DEFINE_BUILTIN_ACCESSOR_A 6139 #undef DEFINE_BUILTIN_ACCESSOR_A
6133 #undef DEFINE_BUILTIN_ACCESSOR_T 6140 #undef DEFINE_BUILTIN_ACCESSOR_T
6134 #undef DEFINE_BUILTIN_ACCESSOR_S 6141 #undef DEFINE_BUILTIN_ACCESSOR_S
6135 #undef DEFINE_BUILTIN_ACCESSOR_H 6142 #undef DEFINE_BUILTIN_ACCESSOR_H
6136 6143
6137 } // namespace internal 6144 } // namespace internal
6138 } // namespace v8 6145 } // namespace v8
OLDNEW
« src/builtins.h ('K') | « src/builtins.h ('k') | src/code-stubs.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698