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 |