| OLD | NEW |
| 1 | |
| 2 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 the V8 project authors. All rights reserved. |
| 3 // 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 |
| 4 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 5 | 4 |
| 6 #ifndef V8_BUILTINS_H_ | 5 #ifndef V8_BUILTINS_BUILTINS_H_ |
| 7 #define V8_BUILTINS_H_ | 6 #define V8_BUILTINS_BUILTINS_H_ |
| 8 | 7 |
| 9 #include "src/base/flags.h" | 8 #include "src/base/flags.h" |
| 10 #include "src/handles.h" | 9 #include "src/handles.h" |
| 11 | 10 |
| 12 namespace v8 { | 11 namespace v8 { |
| 13 namespace internal { | 12 namespace internal { |
| 14 | 13 |
| 15 // Forward declarations. | 14 // Forward declarations. |
| 16 class CodeStubAssembler; | 15 class CodeStubAssembler; |
| 17 | 16 |
| 18 #define CODE_AGE_LIST_WITH_ARG(V, A) \ | 17 #define CODE_AGE_LIST_WITH_ARG(V, A) \ |
| 19 V(Quadragenarian, A) \ | 18 V(Quadragenarian, A) \ |
| 20 V(Quinquagenarian, A) \ | 19 V(Quinquagenarian, A) \ |
| 21 V(Sexagenarian, A) \ | 20 V(Sexagenarian, A) \ |
| 22 V(Septuagenarian, A) \ | 21 V(Septuagenarian, A) \ |
| 23 V(Octogenarian, A) | 22 V(Octogenarian, A) |
| 24 | 23 |
| 25 #define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X) | 24 #define CODE_AGE_LIST_IGNORE_ARG(X, V) V(X) |
| 26 | 25 |
| 27 #define CODE_AGE_LIST(V) \ | 26 #define CODE_AGE_LIST(V) CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) |
| 28 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) | |
| 29 | 27 |
| 30 #define CODE_AGE_LIST_COMPLETE(V) \ | 28 #define CODE_AGE_LIST_COMPLETE(V) \ |
| 31 V(ToBeExecutedOnce) \ | 29 V(ToBeExecutedOnce) \ |
| 32 V(NotExecuted) \ | 30 V(NotExecuted) \ |
| 33 V(ExecutedOnce) \ | 31 V(ExecutedOnce) \ |
| 34 V(NoAge) \ | 32 V(NoAge) \ |
| 35 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) | 33 CODE_AGE_LIST_WITH_ARG(CODE_AGE_LIST_IGNORE_ARG, V) |
| 36 | 34 |
| 37 #define DECLARE_CODE_AGE_BUILTIN(C, V) \ | 35 #define DECLARE_CODE_AGE_BUILTIN(C, V) \ |
| 38 V(Make##C##CodeYoungAgainOddMarking, BUILTIN, kNoExtraICState) \ | 36 V(Make##C##CodeYoungAgainOddMarking, BUILTIN, kNoExtraICState) \ |
| 39 V(Make##C##CodeYoungAgainEvenMarking, BUILTIN, kNoExtraICState) | 37 V(Make##C##CodeYoungAgainEvenMarking, BUILTIN, kNoExtraICState) |
| 40 | 38 |
| 41 // Define list of builtins implemented in C++. | 39 // Define list of builtins implemented in C++. |
| 42 #define BUILTIN_LIST_C(V) \ | 40 #define BUILTIN_LIST_C(V) \ |
| 43 V(Illegal, BUILTIN_EXIT) \ | 41 V(Illegal, BUILTIN_EXIT) \ |
| 44 \ | 42 \ |
| (...skipping 340 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 385 | 383 |
| 386 // Define list of builtins used by the debugger implemented in assembly. | 384 // Define list of builtins used by the debugger implemented in assembly. |
| 387 #define BUILTIN_LIST_DEBUG_A(V) \ | 385 #define BUILTIN_LIST_DEBUG_A(V) \ |
| 388 V(Return_DebugBreak, BUILTIN, kNoExtraICState) \ | 386 V(Return_DebugBreak, BUILTIN, kNoExtraICState) \ |
| 389 V(Slot_DebugBreak, BUILTIN, kNoExtraICState) \ | 387 V(Slot_DebugBreak, BUILTIN, kNoExtraICState) \ |
| 390 V(FrameDropper_LiveEdit, BUILTIN, kNoExtraICState) | 388 V(FrameDropper_LiveEdit, BUILTIN, kNoExtraICState) |
| 391 | 389 |
| 392 class BuiltinFunctionTable; | 390 class BuiltinFunctionTable; |
| 393 class ObjectVisitor; | 391 class ObjectVisitor; |
| 394 | 392 |
| 395 | |
| 396 class Builtins { | 393 class Builtins { |
| 397 public: | 394 public: |
| 398 ~Builtins(); | 395 ~Builtins(); |
| 399 | 396 |
| 400 // Generate all builtin code objects. Should be called once during | 397 // Generate all builtin code objects. Should be called once during |
| 401 // isolate initialization. | 398 // isolate initialization. |
| 402 void SetUp(Isolate* isolate, bool create_heap_objects); | 399 void SetUp(Isolate* isolate, bool create_heap_objects); |
| 403 void TearDown(); | 400 void TearDown(); |
| 404 | 401 |
| 405 // Garbage collection support. | 402 // Garbage collection support. |
| 406 void IterateBuiltins(ObjectVisitor* v); | 403 void IterateBuiltins(ObjectVisitor* v); |
| 407 | 404 |
| 408 // Disassembler support. | 405 // Disassembler support. |
| 409 const char* Lookup(byte* pc); | 406 const char* Lookup(byte* pc); |
| 410 | 407 |
| 411 enum Name { | 408 enum Name { |
| 412 #define DEF_ENUM_C(name, ignore) k##name, | 409 #define DEF_ENUM_C(name, ignore) k##name, |
| 413 #define DEF_ENUM_A(name, kind, extra) k##name, | 410 #define DEF_ENUM_A(name, kind, extra) k##name, |
| 414 #define DEF_ENUM_T(name, argc) k##name, | 411 #define DEF_ENUM_T(name, argc) k##name, |
| 415 #define DEF_ENUM_S(name, kind, extra, interface_descriptor) k##name, | 412 #define DEF_ENUM_S(name, kind, extra, interface_descriptor) k##name, |
| 416 #define DEF_ENUM_H(name, kind) k##name, | 413 #define DEF_ENUM_H(name, kind) k##name, |
| 417 BUILTIN_LIST_C(DEF_ENUM_C) BUILTIN_LIST_A(DEF_ENUM_A) | 414 BUILTIN_LIST_C(DEF_ENUM_C) |
| 418 BUILTIN_LIST_T(DEF_ENUM_T) BUILTIN_LIST_S(DEF_ENUM_S) | 415 BUILTIN_LIST_A(DEF_ENUM_A) |
| 419 BUILTIN_LIST_H(DEF_ENUM_H) BUILTIN_LIST_DEBUG_A(DEF_ENUM_A) | 416 BUILTIN_LIST_T(DEF_ENUM_T) |
| 417 BUILTIN_LIST_S(DEF_ENUM_S) |
| 418 BUILTIN_LIST_H(DEF_ENUM_H) |
| 419 BUILTIN_LIST_DEBUG_A(DEF_ENUM_A) |
| 420 #undef DEF_ENUM_C | 420 #undef DEF_ENUM_C |
| 421 #undef DEF_ENUM_A | 421 #undef DEF_ENUM_A |
| 422 #undef DEF_ENUM_T | 422 #undef DEF_ENUM_T |
| 423 #undef DEF_ENUM_S | 423 #undef DEF_ENUM_S |
| 424 #undef DEF_ENUM_H | 424 #undef DEF_ENUM_H |
| 425 builtin_count | 425 builtin_count |
| 426 }; | 426 }; |
| 427 | 427 |
| 428 enum CFunctionId { | 428 enum CFunctionId { |
| 429 #define DEF_ENUM_C(name, ignore) c_##name, | 429 #define DEF_ENUM_C(name, ignore) c_##name, |
| 430 BUILTIN_LIST_C(DEF_ENUM_C) | 430 BUILTIN_LIST_C(DEF_ENUM_C) |
| 431 #undef DEF_ENUM_C | 431 #undef DEF_ENUM_C |
| 432 cfunction_count | 432 cfunction_count |
| 433 }; | 433 }; |
| 434 | 434 |
| 435 #define DECLARE_BUILTIN_ACCESSOR_C(name, ignore) Handle<Code> name(); | 435 #define DECLARE_BUILTIN_ACCESSOR_C(name, ignore) Handle<Code> name(); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 464 Code* builtin(Name name) { | 464 Code* builtin(Name name) { |
| 465 // Code::cast cannot be used here since we access builtins | 465 // Code::cast cannot be used here since we access builtins |
| 466 // during the marking phase of mark sweep. See IC::Clear. | 466 // during the marking phase of mark sweep. See IC::Clear. |
| 467 return reinterpret_cast<Code*>(builtins_[name]); | 467 return reinterpret_cast<Code*>(builtins_[name]); |
| 468 } | 468 } |
| 469 | 469 |
| 470 Address builtin_address(Name name) { | 470 Address builtin_address(Name name) { |
| 471 return reinterpret_cast<Address>(&builtins_[name]); | 471 return reinterpret_cast<Address>(&builtins_[name]); |
| 472 } | 472 } |
| 473 | 473 |
| 474 static Address c_function_address(CFunctionId id) { | 474 static Address c_function_address(CFunctionId id) { return c_functions_[id]; } |
| 475 return c_functions_[id]; | |
| 476 } | |
| 477 | 475 |
| 478 const char* name(int index) { | 476 const char* name(int index) { |
| 479 DCHECK(index >= 0); | 477 DCHECK(index >= 0); |
| 480 DCHECK(index < builtin_count); | 478 DCHECK(index < builtin_count); |
| 481 return names_[index]; | 479 return names_[index]; |
| 482 } | 480 } |
| 483 | 481 |
| 484 bool is_initialized() const { return initialized_; } | 482 bool is_initialized() const { return initialized_; } |
| 485 | 483 |
| 486 MUST_USE_RESULT static MaybeHandle<Object> InvokeApiFunction( | 484 MUST_USE_RESULT static MaybeHandle<Object> InvokeApiFunction( |
| (...skipping 327 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 static void Generate_InterpreterPushArgsAndTailCallFunction( | 812 static void Generate_InterpreterPushArgsAndTailCallFunction( |
| 815 MacroAssembler* masm) { | 813 MacroAssembler* masm) { |
| 816 return Generate_InterpreterPushArgsAndCallImpl(masm, TailCallMode::kAllow, | 814 return Generate_InterpreterPushArgsAndCallImpl(masm, TailCallMode::kAllow, |
| 817 CallableType::kJSFunction); | 815 CallableType::kJSFunction); |
| 818 } | 816 } |
| 819 static void Generate_InterpreterPushArgsAndCallImpl( | 817 static void Generate_InterpreterPushArgsAndCallImpl( |
| 820 MacroAssembler* masm, TailCallMode tail_call_mode, | 818 MacroAssembler* masm, TailCallMode tail_call_mode, |
| 821 CallableType function_type); | 819 CallableType function_type); |
| 822 static void Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm); | 820 static void Generate_InterpreterPushArgsAndConstruct(MacroAssembler* masm); |
| 823 | 821 |
| 824 #define DECLARE_CODE_AGE_BUILTIN_GENERATOR(C) \ | 822 #define DECLARE_CODE_AGE_BUILTIN_GENERATOR(C) \ |
| 825 static void Generate_Make##C##CodeYoungAgainEvenMarking( \ | 823 static void Generate_Make##C##CodeYoungAgainEvenMarking( \ |
| 826 MacroAssembler* masm); \ | 824 MacroAssembler* masm); \ |
| 827 static void Generate_Make##C##CodeYoungAgainOddMarking( \ | 825 static void Generate_Make##C##CodeYoungAgainOddMarking(MacroAssembler* masm); |
| 828 MacroAssembler* masm); | |
| 829 CODE_AGE_LIST(DECLARE_CODE_AGE_BUILTIN_GENERATOR) | 826 CODE_AGE_LIST(DECLARE_CODE_AGE_BUILTIN_GENERATOR) |
| 830 #undef DECLARE_CODE_AGE_BUILTIN_GENERATOR | 827 #undef DECLARE_CODE_AGE_BUILTIN_GENERATOR |
| 831 | 828 |
| 832 static void Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm); | 829 static void Generate_MarkCodeAsToBeExecutedOnce(MacroAssembler* masm); |
| 833 static void Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm); | 830 static void Generate_MarkCodeAsExecutedOnce(MacroAssembler* masm); |
| 834 static void Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm); | 831 static void Generate_MarkCodeAsExecutedTwice(MacroAssembler* masm); |
| 835 | 832 |
| 836 static void Generate_AtomicsLoad(CodeStubAssembler* assembler); | 833 static void Generate_AtomicsLoad(CodeStubAssembler* assembler); |
| 837 static void Generate_AtomicsStore(CodeStubAssembler* assembler); | 834 static void Generate_AtomicsStore(CodeStubAssembler* assembler); |
| 838 | 835 |
| 839 static void InitBuiltinFunctionTable(); | 836 static void InitBuiltinFunctionTable(); |
| 840 | 837 |
| 841 bool initialized_; | 838 bool initialized_; |
| 842 | 839 |
| 843 friend class BuiltinFunctionTable; | 840 friend class BuiltinFunctionTable; |
| 844 friend class Isolate; | 841 friend class Isolate; |
| 845 | 842 |
| 846 DISALLOW_COPY_AND_ASSIGN(Builtins); | 843 DISALLOW_COPY_AND_ASSIGN(Builtins); |
| 847 }; | 844 }; |
| 848 | 845 |
| 849 } // namespace internal | 846 } // namespace internal |
| 850 } // namespace v8 | 847 } // namespace v8 |
| 851 | 848 |
| 852 #endif // V8_BUILTINS_H_ | 849 #endif // V8_BUILTINS_BUILTINS_H_ |
| OLD | NEW |