OLD | NEW |
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 #ifndef V8_CODE_STUBS_H_ | 5 #ifndef V8_CODE_STUBS_H_ |
6 #define V8_CODE_STUBS_H_ | 6 #define V8_CODE_STUBS_H_ |
7 | 7 |
8 #include "src/allocation.h" | 8 #include "src/allocation.h" |
9 #include "src/assembler.h" | 9 #include "src/assembler.h" |
10 #include "src/codegen.h" | 10 #include "src/codegen.h" |
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
416 explicit PlatformCodeStub(Isolate* isolate) : CodeStub(isolate) {} | 416 explicit PlatformCodeStub(Isolate* isolate) : CodeStub(isolate) {} |
417 | 417 |
418 // Generates the assembler code for the stub. | 418 // Generates the assembler code for the stub. |
419 virtual void Generate(MacroAssembler* masm) = 0; | 419 virtual void Generate(MacroAssembler* masm) = 0; |
420 | 420 |
421 DEFINE_CODE_STUB_BASE(PlatformCodeStub, CodeStub); | 421 DEFINE_CODE_STUB_BASE(PlatformCodeStub, CodeStub); |
422 }; | 422 }; |
423 | 423 |
424 | 424 |
425 enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; | 425 enum StubFunctionMode { NOT_JS_FUNCTION_STUB_MODE, JS_FUNCTION_STUB_MODE }; |
426 enum HandlerArgumentsMode { DONT_PASS_ARGUMENTS, PASS_ARGUMENTS }; | |
427 | 426 |
428 | 427 |
429 class CodeStubDescriptor { | 428 class CodeStubDescriptor { |
430 public: | 429 public: |
431 explicit CodeStubDescriptor(CodeStub* stub); | 430 explicit CodeStubDescriptor(CodeStub* stub); |
432 | 431 |
433 CodeStubDescriptor(Isolate* isolate, uint32_t stub_key); | 432 CodeStubDescriptor(Isolate* isolate, uint32_t stub_key); |
434 | 433 |
435 void Initialize(Address deoptimization_handler = NULL, | 434 void Initialize(Address deoptimization_handler = NULL, |
436 int hint_stack_parameter_count = -1, | 435 int hint_stack_parameter_count = -1, |
437 StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE); | 436 StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE); |
438 void Initialize(Register stack_parameter_count, | 437 void Initialize(Register stack_parameter_count, |
439 Address deoptimization_handler = NULL, | 438 Address deoptimization_handler = NULL, |
440 int hint_stack_parameter_count = -1, | 439 int hint_stack_parameter_count = -1, |
441 StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE, | 440 StubFunctionMode function_mode = NOT_JS_FUNCTION_STUB_MODE); |
442 HandlerArgumentsMode handler_mode = DONT_PASS_ARGUMENTS); | |
443 | 441 |
444 void SetMissHandler(ExternalReference handler) { | 442 void SetMissHandler(ExternalReference handler) { |
445 miss_handler_ = handler; | 443 miss_handler_ = handler; |
446 has_miss_handler_ = true; | 444 has_miss_handler_ = true; |
447 // Our miss handler infrastructure doesn't currently support | 445 // Our miss handler infrastructure doesn't currently support |
448 // variable stack parameter counts. | 446 // variable stack parameter counts. |
449 DCHECK(!stack_parameter_count_.is_valid()); | 447 DCHECK(!stack_parameter_count_.is_valid()); |
450 } | 448 } |
451 | 449 |
452 void set_call_descriptor(CallInterfaceDescriptor d) { call_descriptor_ = d; } | 450 void set_call_descriptor(CallInterfaceDescriptor d) { call_descriptor_ = d; } |
453 CallInterfaceDescriptor call_descriptor() const { return call_descriptor_; } | 451 CallInterfaceDescriptor call_descriptor() const { return call_descriptor_; } |
454 | 452 |
455 int GetRegisterParameterCount() const { | 453 int GetRegisterParameterCount() const { |
456 return call_descriptor().GetRegisterParameterCount(); | 454 return call_descriptor().GetRegisterParameterCount(); |
457 } | 455 } |
458 | 456 |
| 457 int GetStackParameterCount() const { |
| 458 return call_descriptor().GetStackParameterCount(); |
| 459 } |
| 460 |
| 461 int GetParameterCount() const { |
| 462 return call_descriptor().GetParameterCount(); |
| 463 } |
| 464 |
459 Register GetRegisterParameter(int index) const { | 465 Register GetRegisterParameter(int index) const { |
460 return call_descriptor().GetRegisterParameter(index); | 466 return call_descriptor().GetRegisterParameter(index); |
461 } | 467 } |
462 | 468 |
463 Type* GetParameterType(int index) const { | 469 Type* GetParameterType(int index) const { |
464 return call_descriptor().GetParameterType(index); | 470 return call_descriptor().GetParameterType(index); |
465 } | 471 } |
466 | 472 |
467 ExternalReference miss_handler() const { | 473 ExternalReference miss_handler() const { |
468 DCHECK(has_miss_handler_); | 474 DCHECK(has_miss_handler_); |
469 return miss_handler_; | 475 return miss_handler_; |
470 } | 476 } |
471 | 477 |
472 bool has_miss_handler() const { | 478 bool has_miss_handler() const { |
473 return has_miss_handler_; | 479 return has_miss_handler_; |
474 } | 480 } |
475 | 481 |
476 int GetHandlerParameterCount() const { | 482 int GetHandlerParameterCount() const { |
477 int params = GetRegisterParameterCount(); | 483 int params = GetParameterCount(); |
478 if (handler_arguments_mode_ == PASS_ARGUMENTS) { | 484 if (PassesArgumentsToDeoptimizationHandler()) { |
479 params += 1; | 485 params += 1; |
480 } | 486 } |
481 return params; | 487 return params; |
482 } | 488 } |
483 | 489 |
484 int hint_stack_parameter_count() const { return hint_stack_parameter_count_; } | 490 int hint_stack_parameter_count() const { return hint_stack_parameter_count_; } |
485 Register stack_parameter_count() const { return stack_parameter_count_; } | 491 Register stack_parameter_count() const { return stack_parameter_count_; } |
486 StubFunctionMode function_mode() const { return function_mode_; } | 492 StubFunctionMode function_mode() const { return function_mode_; } |
487 Address deoptimization_handler() const { return deoptimization_handler_; } | 493 Address deoptimization_handler() const { return deoptimization_handler_; } |
488 | 494 |
489 private: | 495 private: |
| 496 bool PassesArgumentsToDeoptimizationHandler() const { |
| 497 return stack_parameter_count_.is_valid(); |
| 498 } |
| 499 |
490 CallInterfaceDescriptor call_descriptor_; | 500 CallInterfaceDescriptor call_descriptor_; |
491 Register stack_parameter_count_; | 501 Register stack_parameter_count_; |
492 // If hint_stack_parameter_count_ > 0, the code stub can optimize the | 502 // If hint_stack_parameter_count_ > 0, the code stub can optimize the |
493 // return sequence. Default value is -1, which means it is ignored. | 503 // return sequence. Default value is -1, which means it is ignored. |
494 int hint_stack_parameter_count_; | 504 int hint_stack_parameter_count_; |
495 StubFunctionMode function_mode_; | 505 StubFunctionMode function_mode_; |
496 | 506 |
497 Address deoptimization_handler_; | 507 Address deoptimization_handler_; |
498 HandlerArgumentsMode handler_arguments_mode_; | |
499 | 508 |
500 ExternalReference miss_handler_; | 509 ExternalReference miss_handler_; |
501 bool has_miss_handler_; | 510 bool has_miss_handler_; |
502 }; | 511 }; |
503 | 512 |
504 | 513 |
505 class HydrogenCodeStub : public CodeStub { | 514 class HydrogenCodeStub : public CodeStub { |
506 public: | 515 public: |
507 enum InitializationState { | 516 enum InitializationState { |
508 UNINITIALIZED, | 517 UNINITIALIZED, |
(...skipping 2552 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3061 #undef DEFINE_PLATFORM_CODE_STUB | 3070 #undef DEFINE_PLATFORM_CODE_STUB |
3062 #undef DEFINE_HANDLER_CODE_STUB | 3071 #undef DEFINE_HANDLER_CODE_STUB |
3063 #undef DEFINE_HYDROGEN_CODE_STUB | 3072 #undef DEFINE_HYDROGEN_CODE_STUB |
3064 #undef DEFINE_CODE_STUB | 3073 #undef DEFINE_CODE_STUB |
3065 #undef DEFINE_CODE_STUB_BASE | 3074 #undef DEFINE_CODE_STUB_BASE |
3066 | 3075 |
3067 extern Representation RepresentationFromType(Type* type); | 3076 extern Representation RepresentationFromType(Type* type); |
3068 } } // namespace v8::internal | 3077 } } // namespace v8::internal |
3069 | 3078 |
3070 #endif // V8_CODE_STUBS_H_ | 3079 #endif // V8_CODE_STUBS_H_ |
OLD | NEW |